Мне нужно создать один указатель на массив указателей с нулевым символом в конце.
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
).
Просто как идея. Может быть, они проверяют, если это разные объекты. Возможно, они используют предыдущие указатели и не ожидают, что значение val [0] будет изменено после изменения val [1].
Также проверьте API, возможно, они ожидают, что остальные поля заполнены
Это зависит от того, как создается массив и где он хранится / используется. основываясь на предоставленном коде, я предполагаю, что массив был сгенерирован в стеке памяти, но затем использован после извлечения этого уровня стека (т.е. функция возвращает). Память массива будет освобождена, а указатель массива будет недействительным (вызовет непредвиденное поведение). Если вам нужно сохранить массив вне стека, вам нужно сгенерировать его в куче, используя 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
это позже, когда вы закончите с памятью, чтобы не было утечки памяти.
Вам нужно прочитать спецификацию 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;