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

看板C_and_CPP (C/C++)作者 (f814030買者會視接單數量)時間11年前 (2015/04/23 18:43), 11年前編輯推噓6(6021)
留言27則, 3人參與, 最新討論串1/1
開發平台(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

04/23 19:00, , 1F
搞不好是xe7的問題
04/23 19:00, 1F
小弟很不想承認是xe7 的問題~"~…但也有這麼想過@@

04/23 19:08, , 2F
dll接口是std::string?還是char*
04/23 19:08, 2F
String 是function 回傳的資料,而看到的資料都是????,接口是wchar_t*。 ※ 編輯: f814030 (123.205.14.43), 04/23/2015 19:10:20

04/23 19:32, , 3F
是怎麼清掉變數?感覺這個指標直接丟棄就好
04/23 19:32, 3F
因為這個變數是區域變數,我若不理它,讓系統自已清掉這個變數, 那麼就會有非法寫入記憶體的錯誤,(抱歉,我忘記這個錯誤的英文是顯示什麼)請問 您有其它的方法可以清掉這個指標嗎?謝謝。 ※ 編輯: f814030 (123.205.14.43), 04/23/2015 19:42:50

04/23 20:31, , 4F
收到 wchar_t * 用 ::MessageBoxW(0, text, 0, MB_OK);
04/23 20:31, 4F

04/23 20:32, , 5F
先把內容印出來看看,如果內容正常代表有其他的問題
04/23 20:32, 5F

04/23 20:34, , 6F
通常由 DLL 配置的記憶體,都會有另一接口進行刪除
04/23 20:34, 6F

04/23 20:34, , 7F
除非該回傳的記憶體位置,沒有想要讓使用者進行刪除
04/23 20:34, 7F

04/23 20:35, , 8F
因為不同的 DLL 可能有不同的 heap,通常不會這樣刪除
04/23 20:35, 8F

04/23 20:36, , 9F
當然這得看實作,其原因也可參閱 http://goo.gl/K4S2NP
04/23 20:36, 9F

04/23 20:39, , 10F
另外在 Windows 上非法寫入就是 access violation
04/23 20:39, 10F

04/23 20:40, , 11F
其錯誤代碼為 0xc0000005,也可用 SEH 或者 VEH 攔截
04/23 20:40, 11F

04/23 21:08, , 12F
感覺上是函式調用約定不對, 導致返回值指標不對
04/23 21:08, 12F

04/23 21:09, , 13F
這在接dll又不熟調用約定時很常發生
04/23 21:09, 13F

04/23 21:11, , 14F
錯誤觸發時間點會是有呼叫dll函式的那個函式返回時
04/23 21:11, 14F

04/23 21:12, , 15F
樓上說的也是有可能,__cdecl __stdcall 都加上去試試
04/23 21:12, 15F

04/23 21:13, , 16F
多數 DLL 開發接口,應該會提供對應的 header file
04/23 21:13, 16F

04/23 21:14, , 17F
然而有可能是 DLL 開發者沒有將其詳載於內部就是
04/23 21:14, 17F
可惜的是,只有給dll,沒有給h檔…非常感謝L大及R大, 和小弟講了那麼多,我在調用DLL時,有使用 __stdcall,有加或無加結果都相同, 另外,如果廠商沒有提供刪除的接口,是否該指標就無法手動刪除了? 最後再次感謝您們不吝指教!小弟在試試看! ※ 編輯: f814030 (123.205.14.43), 04/23/2015 21:20:34

04/23 21:23, , 18F
某些 DLL 可能是在被 unload 時才把該記憶體刪除
04/23 21:23, 18F

04/23 21:24, , 19F
有可能該指標指到的字串是由 DLL 內部管理其生命週期
04/23 21:24, 19F

04/23 21:24, , 20F
而該接口只是提供一個 const wchar_t * 的返回值 ?
04/23 21:24, 20F

04/23 21:25, , 21F
建議可以用 dumpbin /exports 檢查 calling convention
04/23 21:25, 21F

04/23 21:26, , 22F
不過這個是 VC 上的工具,我只有 VC2013 沒辦法幫你試
04/23 21:26, 22F

04/23 21:26, , 23F
話說 Visual Studio Community 2013 不用錢就可以用
04/23 21:26, 23F

04/23 21:26, , 24F
建議原 po 可以裝來用用看 :) 祝順利!
04/23 21:26, 24F

04/23 21:30, , 25F
忘了說你不是花錢買的嗎? 應該會有售後服務吧 XD
04/23 21:30, 25F

04/23 21:31, , 26F
c++ builder預設是__fastcall , 你還可以試__cdecl
04/23 21:31, 26F

04/23 21:35, , 27F
說真的, 這問題還是問廠商比較快
04/23 21:35, 27F
小弟後來試著把得到的String 轉成 utf8, 讓系統可以認得這文字,之後丟棄這變數,就不會出錯了! 感謝大家的指教!謝謝! ※ 編輯: f814030 (211.72.118.19), 04/24/2015 13:43:33 ※ 編輯: f814030 (123.205.14.43), 04/24/2015 18:41:11
文章代碼(AID): #1LECoqYP (C_and_CPP)
文章代碼(AID): #1LECoqYP (C_and_CPP)