各位哥哥, 用C++的一個程式中 呼叫C++ DLL中的這個函式
extern "C" char* __stdcall GetSomething()
{
char* Name = "WuHan";
return Name;
}
在代碼如下 :
char* vID = GetSomething();
結果顯示 在 DLL中 NAME值 正常, 但是回傳到C++程式卻為空,請問問題在哪,怎么解決?感謝各位哥哥。
uj5u.com熱心網友回復:
GetSomething函式修改一下,GetSomething(CString str);uj5u.com熱心網友回復:
__stdcall 在函式退出時就清堆疊了,一般不能使用區域變數做回傳值試試 __cdecl
或者建議把緩沖區和緩沖區和長度作為指標傳入,這樣不受呼叫規約影響
extern "C" char* __stdcall GetSomething(char *szBuffer, int iLen)
{
strcpy_s(szBuffer, iLen, "xxxx");
return szBuffer;
}
uj5u.com熱心網友回復:
CString 好像需要頭檔案支持, 我這個是在一個DLL程式中
uj5u.com熱心網友回復:
__cdecl 回傳仍然是空,我覺得應該是清堆疊之后找不到原記憶體位置的值
然后我用了后面這個公式,提示 錯誤 2 error LNK1120: 1 個無法決議的外部命令
uj5u.com熱心網友回復:
char* Name = "WuHan";// 在 堆疊 中return Name;// name 被 destroy 指標 無效 !
uj5u.com熱心網友回復:
char* Name = "WuHan";港道理因為是在全域靜態變數里。但怎么被優化成了
char Name[] = "WuHan";
成了區域變數。
uj5u.com熱心網友回復:
extern "C" char* __stdcall GetSomething(){
static char Name[] = "WuHan";
return Name;
}
uj5u.com熱心網友回復:
用std::string多方便,不要用char*。把char*換成std::string 就可以了。uj5u.com熱心網友回復:
不要回傳區域變數的指標或參考。uj5u.com熱心網友回復:
定義全域字串
static const char *version = "something";
const char* GetSomeThing(void)
{
return version;
}
uj5u.com熱心網友回復:
std::string dll傳輸程序如果不同編譯方式,可能會有記憶體釋放崩潰。建議用GetSomething(char *pBuf, int size)
{
strncpy(pBuf, "你的資料", std::min(strlen("你的資料"), size));
}
uj5u.com熱心網友回復:
char* Name = "WuHan"分配的記憶體在堆疊上,函式運行完畢,也就是return后其生命周期就結束了,這時候會執行出堆疊然后被釋放掉,所以函式不要回傳區域變數的指標。區域變數/函式的引數都是在堆疊區的。你可以new一個空間,這個開辟的空間是在堆上的,函式執行完畢,也不會被釋放掉,需要自己手動釋放才可以;new之后,再拷貝下資料到你申請的記憶體中
至于new之后關于dll中記憶體釋放的問題,就是另外一個問題
uj5u.com熱心網友回復:
最好的是你傳遞個buffer到dll,dll中的介面填充這個buffer轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/15240.html
標籤:進程/線程/DLL
