→ testPtt: 搞不好是xe7的問題 04/23 19:00
小弟很不想承認是xe7 的問題~"~…但也有這麼想過@@
推 rephansu: dll接口是std::string?還是char* 04/23 19:08
String 是function 回傳的資料,而看到的資料都是????,接口是wchar_t*。
※ 編輯: f814030 (123.205.14.43), 04/23/2015 19:10:20
推 rephansu: 是怎麼清掉變數?感覺這個指標直接丟棄就好 04/23 19:32
因為這個變數是區域變數,我若不理它,讓系統自已清掉這個變數,
那麼就會有非法寫入記憶體的錯誤,(抱歉,我忘記這個錯誤的英文是顯示什麼)請問
您有其它的方法可以清掉這個指標嗎?謝謝。
※ 編輯: f814030 (123.205.14.43), 04/23/2015 19:42:50
推 LiloHuang: 收到 wchar_t * 用 ::MessageBoxW(0, text, 0, MB_OK); 04/23 20:31
→ LiloHuang: 先把內容印出來看看,如果內容正常代表有其他的問題 04/23 20:32
→ LiloHuang: 通常由 DLL 配置的記憶體,都會有另一接口進行刪除 04/23 20:34
→ LiloHuang: 除非該回傳的記憶體位置,沒有想要讓使用者進行刪除 04/23 20:34
→ LiloHuang: 因為不同的 DLL 可能有不同的 heap,通常不會這樣刪除 04/23 20:35
→ LiloHuang: 另外在 Windows 上非法寫入就是 access violation 04/23 20:39
→ LiloHuang: 其錯誤代碼為 0xc0000005,也可用 SEH 或者 VEH 攔截 04/23 20:40
→ rephansu: 感覺上是函式調用約定不對, 導致返回值指標不對 04/23 21:08
→ rephansu: 這在接dll又不熟調用約定時很常發生 04/23 21:09
→ rephansu: 錯誤觸發時間點會是有呼叫dll函式的那個函式返回時 04/23 21:11
→ LiloHuang: 樓上說的也是有可能,__cdecl __stdcall 都加上去試試 04/23 21:12
→ LiloHuang: 多數 DLL 開發接口,應該會提供對應的 header file 04/23 21:13
→ LiloHuang: 然而有可能是 DLL 開發者沒有將其詳載於內部就是 04/23 21:14
可惜的是,只有給dll,沒有給h檔…非常感謝L大及R大,
和小弟講了那麼多,我在調用DLL時,有使用 __stdcall,有加或無加結果都相同,
另外,如果廠商沒有提供刪除的接口,是否該指標就無法手動刪除了?
最後再次感謝您們不吝指教!小弟在試試看!
※ 編輯: f814030 (123.205.14.43), 04/23/2015 21:20:34
推 LiloHuang: 某些 DLL 可能是在被 unload 時才把該記憶體刪除 04/23 21:23
→ LiloHuang: 有可能該指標指到的字串是由 DLL 內部管理其生命週期 04/23 21:24
→ LiloHuang: 而該接口只是提供一個 const wchar_t * 的返回值 ? 04/23 21:24
→ LiloHuang: 建議可以用 dumpbin /exports 檢查 calling convention 04/23 21:25
→ LiloHuang: 不過這個是 VC 上的工具,我只有 VC2013 沒辦法幫你試 04/23 21:26
→ LiloHuang: 話說 Visual Studio Community 2013 不用錢就可以用 04/23 21:26
→ LiloHuang: 建議原 po 可以裝來用用看 :) 祝順利! 04/23 21:26
推 LiloHuang: 忘了說你不是花錢買的嗎? 應該會有售後服務吧 XD 04/23 21:30
→ rephansu: c++ builder預設是__fastcall , 你還可以試__cdecl 04/23 21:31
推 rephansu: 說真的, 這問題還是問廠商比較快 04/23 21:35
小弟後來試著把得到的String 轉成 utf8,
讓系統可以認得這文字,之後丟棄這變數,就不會出錯了!
感謝大家的指教!謝謝!
※ 編輯: f814030 (211.72.118.19), 04/24/2015 13:43:33
※ 編輯: f814030 (123.205.14.43), 04/24/2015 18:41:11