Указатель на массив указателей структур

Мне нужно создать один указатель на массив указателей с нулевым символом в конце.

Struct: WFS_RESULT

typedef struct _wfs_result
{
REQUESTID       RequestID;
HSERVICE        hService;
SYSTEMTIME      tsTimestamp;
HRESULT         hResult;
union {
DWORD       dwCommandCode;
DWORD       dwEventID;
} u;
LPVOID          lpBuffer;
} WFSRESULT, *LPWFSRESULT;

Struct: Пинки

typedef struct _wfs_pin_key_detail_ex
{
LPSTR         lpsKeyName;
DWORD         dwUse;
BYTE          bGeneration;
BYTE          bVersion;
BYTE          bActivatingDate[4];
BYTE          bExpiryDate[4];
BOOL          bLoaded;
} WFSPINKEYDETAILEX, * LPWFSPINKEYDETAILEX;

Программа: Как я пытаюсь сделать

    LPWFSPINKEYDETAILEX* array[7];

LPWFSPINKEYDETAILEX Test;
WFSPINKEYDETAILEX Obj;
Test = &Obj;

Test->lpsKeyName = NULL;

array[0] = &Test;
array[1] = &Test;
array[2] = &Test;
array[3] = &Test;
array[4] = &Test;
array[5] = &Test;
array[6] = NULL;

LPWFSPINKEYDETAILEX** val = array;

lpWFSResult->lpBuffer = val;

Вопрос в том, что я сделал над указателем на массив указателей? Потому что мне нужно передать этот Pointer Array Pointer этому параметру lpWFSResult-> lpBuffer = val; а в итоговой программе (банковское приложение) выдает ошибку -15 (WFS_ERR_INTERNAL_ERROR).

0

Решение

Просто как идея. Может быть, они проверяют, если это разные объекты. Возможно, они используют предыдущие указатели и не ожидают, что значение val [0] будет изменено после изменения val [1].

Также проверьте API, возможно, они ожидают, что остальные поля заполнены

  • lpsKeyName
  • bGeneration
  • bActivatingDate
  • bExpiryDate
0

Другие решения

Это зависит от того, как создается массив и где он хранится / используется. основываясь на предоставленном коде, я предполагаю, что массив был сгенерирован в стеке памяти, но затем использован после извлечения этого уровня стека (т.е. функция возвращает). Память массива будет освобождена, а указатель массива будет недействительным (вызовет непредвиденное поведение). Если вам нужно сохранить массив вне стека, вам нужно сгенерировать его в куче, используя new, Таким образом, память будет сохраняться после выхода из функции и повышения уровня стека памяти.

LPWFSPINKEYDETAILEX** array = new LPWFSPINKEYDETAILEX*[7];

LPWFSPINKEYDETAILEX Test;
WFSPINKEYDETAILEX Obj;
Test = &Obj;

Test->lpsKeyName = NULL;

array[0] = &Test;
array[1] = &Test;
array[2] = &Test;
array[3] = &Test;
array[4] = &Test;
array[5] = &Test;
array[6] = NULL;

lpWFSResult->lpBuffer = array;

Не забудь delete это позже, когда вы закончите с памятью, чтобы не было утечки памяти.

0

Вам нужно прочитать спецификацию API, в которой рассказывается, как выделить память. Я предполагаю, что вы пишете SP, имеете шесть ключей, а имена ключей находятся в массиве keyNames.

int numKeys=6;
LPSTR keyNames[6]={"key1","key2","key3","key4","key5","key6"};
LPWFSRESULT pResult;
LPWFSPINKEYDETAILEX* ppDetails;
WFMAllocateBuffer(sizeof(WFSRESULT), WFS_MEM_ZEROINIT, (LPVOID*)&pResult);
WFMAllocateMore(sizeof(LPWFSPINKEYDETAILEX)*(numKeys+1),pResult, (LPVOID*)&ppDetails);
for (int i=0;i<numKeys;i++)
{
WFMAllocateMore(sizeof(WFSPINKEYDETAILEX),pResult,(LPVOID*)&ppDetails[i]);
WFMAllocateMore(strlen(keyNames[i])+1,pResult,(LPVOID*)&ppDetail[i].lpsKeyName);
strcpy(ppDetails[i].lpsKeyName,keyNames[i]);
//TODO fill in other details
}
ppDetails[numKeys]=NULL;
pResult->lpBuffer=ppDetails;
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector