看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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 變數的值賦于其它變數,系統也會出錯… 請問這該如何處理呢? 謝謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.205.14.43 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1429785780.A.899.html
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: 當然這得看實作,其原因也可參閱 http://goo.gl/K4S2NP 04/23 20:36
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