0

我需要创建一个指向以空结尾的指向关键详细结构的指针数组的指针。

结构: WFS_RESULT

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

结构: PINKEY

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;

问题是,我在指向指针数组的指针上方做了什么?因为,我需要将此指针数组指针传递给此参数lpWFSResult-> lpBuffer = val;,并在最终程序(银行应用程序)中给出错误-15(WFS_ERR_INTERNAL_ERROR)。

4

3 回答 3

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当你完成内存时不要忘记它,这样你就不会发生内存泄漏。

于 2017-03-20T19:52:07.027 回答
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;
于 2017-05-09T17:18:42.670 回答
0

就像想法一样。也许他们检查是否是不同的对象。也许他们正在使用以前的指针,并且不希望在更改 val[1] 后更改 val[0] 的值。

还要检查 API,也许他们希望其余的字段被填满

  • lpsKeyName
  • b一代
  • b激活日期
  • b到期日
于 2017-03-20T17:37:20.447 回答