[英]Using safe mode to get char** from dll (Passed as (IntPtr) parameter to the function)
[英]Get char * from DLL
我有個問題。 我的dll中有一個函數,定義如下:
int function(char *inVal, char *outVal, int *retVal)
我使用LoadLibrary在控制台應用程序中成功加載了我的dll,並使用函數指針調用我的函數:
typedef int (__cdecl *functionPtr)(char *, char *,int *);
然后我將我的inVal傳遞給我的函數:
char * inVal = "input";
現在我想得到我的outVal和retVal,我已成功獲得retVal,但我的outVal為NULL:
int retVal = 0;
char outVal[200] = {0};
然后我調用我的函數:
int return = functionLNK(inVal , outVal, &retVal)
任何線索?!!
編輯1:
代碼如下:
int function(char *inVal, char *outVal, int *retVal)
{
PKI_Buf inBuf, signBuf, pemBuf;
......
outVal = (char*)pemBuf.data;
//I check outVal in this point and it is not NULL
}
問題在於function
。 你通過值傳遞outVal
,這意味着你在函數內部的指針是你傳入的指針的副本。然后你用outVal = (char*)pemBuf.data;
分配給那個指針outVal = (char*)pemBuf.data;
。 您所做的就是修改副本。 外面沒有變化。
這不是你的方法的唯一問題。 您還嘗試將指針傳遞給即將超出范圍的對象的成員。 pemBuf
具有自動存儲持續時間(因為它是function
本地的),這意味着它將在返回時被銷毀。 然后你的指針將指向一個無效的對象。
相反,你想要做的就是復制的內容pemBuf.data
到在由指向數組元素outVal
。 您可以使用std::copy
或strcpy
執行此操作。 但是,您還有另一個問題,即您沒有傳遞緩沖區的大小(我不知道pemBuf.data
數組的大小)。 假設你知道要復制多少N
,你可以這樣做:
std::copy(pemBuf.data, pemBuf.data + N, outVal);
但是,您的代碼非常類似C - 使用C風格的字符串,輸出參數等。 我建議你開始使用std::string
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.