[問題] String內有未知內容,導致非法寫入記憶體

作者: f814030 (f814030買者會視接單數量)   2015-04-23 18:42:55
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
C++ builder XE7
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
廠商提供的dll
問題(Question):
#1 發表時間:2015-04-23 16:48:10 IP:211.72.xxx.xxx 訂閱
各位先進好,
小弟使用軟體版本為 c++ builder xe7
在淘寶買了某電子用品,而有附相關的dll來供我們二次開發,
但使用了dll 的function 之後,會回傳一個 String 字串,但在bcb 裡面只看到[ ????
],
個人清測是因為字碼的關係,只要這個 String 變數結束後,系統要清掉時,就會跑出「
非法寫入記憶體錯誤」,
試過想要把編碼轉換,但只要 String 變數的值賦于其它變數,系統也會出錯…
請問這該如何處理呢?
謝謝。
作者: testPtt (測試)   2015-04-23 19:00:00
搞不好是xe7的問題
作者: rephansu (xanadu)   2015-04-23 19:08:00
dll接口是std::string?還是char*是怎麼清掉變數?感覺這個指標直接丟棄就好
作者: LiloHuang (十年一刻)   2015-04-23 20:31:00
收到 wchar_t * 用 ::MessageBoxW(0, text, 0, MB_OK);先把內容印出來看看,如果內容正常代表有其他的問題通常由 DLL 配置的記憶體,都會有另一接口進行刪除除非該回傳的記憶體位置,沒有想要讓使用者進行刪除因為不同的 DLL 可能有不同的 heap,通常不會這樣刪除當然這得看實作,其原因也可參閱 http://goo.gl/K4S2NP另外在 Windows 上非法寫入就是 access violation其錯誤代碼為 0xc0000005,也可用 SEH 或者 VEH 攔截
作者: rephansu (xanadu)   2015-04-23 21:08:00
感覺上是函式調用約定不對, 導致返回值指標不對這在接dll又不熟調用約定時很常發生錯誤觸發時間點會是有呼叫dll函式的那個函式返回時
作者: LiloHuang (十年一刻)   2015-04-23 21:12:00
樓上說的也是有可能,__cdecl __stdcall 都加上去試試多數 DLL 開發接口,應該會提供對應的 header file然而有可能是 DLL 開發者沒有將其詳載於內部就是某些 DLL 可能是在被 unload 時才把該記憶體刪除有可能該指標指到的字串是由 DLL 內部管理其生命週期而該接口只是提供一個 const wchar_t * 的返回值 ?建議可以用 dumpbin /exports 檢查 calling convention不過這個是 VC 上的工具,我只有 VC2013 沒辦法幫你試話說 Visual Studio Community 2013 不用錢就可以用建議原 po 可以裝來用用看 :) 祝順利!忘了說你不是花錢買的嗎? 應該會有售後服務吧 XD
作者: rephansu (xanadu)   2015-04-23 21:31:00
c++ builder預設是__fastcall , 你還可以試__cdecl說真的, 這問題還是問廠商比較快

Links booklink

Contact Us: admin [ a t ] ucptt.com