跳到主要內容

Export DLL Symbols

終於可以開始 debug DLL project 了!

之前根據 Debugging DLL Projects 的設定,
設定好 debug property 的 caller 並且在 DLL project 裡面設定中斷點,
但是 caller 一被叫起來後,馬上就 exit code 1,
並沒有 hit 到在我在 DLL project 裡設定的中斷點.

原本以為可能是我設定的中斷點不是 entry point ,程式提早結束所以沒有 hit 到.
想一想拿 sample code build 出來的 DLL 去測試,發現 entry point 是對的,
DLL debug 的中斷點在 sample code project 裡面也可以正常的 hit 並且停止.

想了很久後再看一次 caller 的文件,發現可以提高 caller 的 debug level ,
所以可以驗證我的另一個猜測,看是不是我指定的 DLL 其實並沒有被載入?
結果 debug log 顯示, DLL 應該是有被正確載入.
但是為什麼 caller log 會一直顯示載入 entry point function 失敗呢?

突然想到,我的 DLL 真的有 export 該 function 嗎?
Dependency Walker 去分析我的 DLL ,
發現 x86 build 確實有 export function,但是 x64 build 卻是空白的?
這時候我開始想說,難道是 build configuration 有問題?
但是 x86 build 的 DLL caller 也是無法正確載入啊?
那先不管 x64 build 好了,感覺 x86 build 比較有機會突破阻礙.

那再來比較 x86 build export 的 function 和 sample code 的有什麼不一樣
仔細一看,原來是 function name 被 mangling 處理過,多了 "_" prefix.
設定好 DLL project 的 def 檔重 build 後, caller 果然可以載入成功並且 hit 中斷點.
而神奇的 x64 DLL export function 是空白的現象也恢復正常了!

原來要 build 一個 DLL 有這麼多眉角要注意,學到這些東西很開心 :)


留言

這個網誌中的熱門文章

3M UVA3000 更換濾芯紫外線燈匣

用了一年的3M濾水器提示說要換濾芯和燈匣 上 Youtube 想找教學的影片可是沒看到 UVA 3000 的 經過了一番奮戰後在這邊記錄一下 希望可以幫助後人,以免再重蹈覆轍。 Step 1. 拔掉插頭,把淨水器從牆上拿下來(基本上他是掛著而已),比較方便施工。 Step 2. 把前蓋往上拉,很容易就可以看到裡面的東西了。 Step 3. 打開後可以看到有兩個柱狀體,左邊的是燈匣,右邊的是濾芯。 Step 4. 這裡有個祕技是,這兩個柱狀體是可以往上 翻開30 度左右,這樣就可以有比較大的空間施工。 Step 4. 更換濾芯的話,柱狀體的瓶身上有箭頭,往左就是轉開,往右就是鎖緊。 Step 5. 更換燈匣的話比較麻煩一點,因為他底部是電源,頂部的右邊有個突出來的小方塊。對照淨水器上方連接處的話會有個弧形的凹槽,這是要 match 的.如果你只注意瓶身的箭頭往右鎖回去,就會造成漏水...Orz... Step 6. 把前蓋蓋回,機器掛回牆上,插插頭,開水,如果機器沒有告訴你有燈匣異常或漏水的話,就可以長按 C / UV  Reset 計數器了. 所以關鍵字就是,要往上翻 30 度,燈匣上面的小凸點要在右側,要看瓶身的 小箭頭. May it helps!

全球鷹/響尾蛇 D300 行車記錄器

全球鷹 Global Eagle /響尾蛇 D300 行車記錄器 前後雙鏡頭,透過電瓶的壓升壓降來開啟/關閉行車記錄器主機 wifi 是 mmcx 接頭,去淘寶買一條 20 元 預設 wifi 密碼是 12345678 透過 TimaCam 可以 wifi 連線主機,用來看即時鏡頭畫面還可以 但是要下載一個片段 216MB 非常慢,讓我看到噪音管和吐白煙的想檢舉也覺得麻煩... 主機拆下後,即使透過 USB 供電也無法開機, 要操作主機只能發動機車在車子旁邊操作, 主機沒接線的裝態也不能直接拿來看錄影檔。 從 2018.3 月安裝到現在,發生過一次熄火吃完飯(約20分鐘),竟然沒關機還在錄影。還好只是 20 分鐘,不然電瓶的電不知道會不會被吃完。 現在都很提心吊膽,熄火後都會等他壓降關機後(約 1 分鐘)才會離開。 早知道還是裝一般開電門供電,關電門關機的機種。 wifi 看檔和安裝容易都只是噱頭,買了才知道難用。