none
DLL呼叫DLL的疑問 RRS feed

  • 問題

  • 我用Win32專案去做一個DLL
    然後我在專案建立的選項裡面,勾了一個叫做會出符號的屬性
    然後建立出來的專案就會以class的型態存在
    如果我要使用這個DLL就在別的專案設定就OK了
    不過這個DLL的使用好像是要先宣告該DLL的類別以後才能使用,就跟一班類別是一樣的使用方法

    但是我發現如果使用LoadLibary載入DLL是OK的
    但是再用GetProcAddress去找要執行的函式就會找不到了
    可是我DLL都載入了,為什麼會找不哩???
    還是說這種DLL本來就不能動態載入了
    我是哪裡搞錯了???

    2010年1月19日 上午 08:21

解答

  • 函數庫沒有類別這種東西,需要宣告類別的是 COM 類別庫,有可能裡面還有靜態的 Function 。

    所以請先把你引用的 dll 搞清楚是什麼型態。

    VS 附了很多 dll 觀看函數的工具,先拿來玩玩搞清楚你的東西是啥。

    如果你用的是 VS2008 ,微軟已經沒有再提供原先的工具了,在網路上搜尋:Dependency Walker ,這是專門看函數型的 dll 。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 oven425 2010年1月27日 上午 06:54
    2010年1月20日 下午 03:46
  • 因為你沒有宣告別名,你的進入點是這樣:
    ??0Cwin32class@@QAE@XZ
    ??4Cwin32class@@QAEAAV0@ABV0@@Z
    ?fnwin32class@@YAHXZ
    ?getwin32classname@Cwin32class@@QAEXPA_W@Z
    ?nwin32class@@3HA
    ?showwin32class@Cwin32class@@QAEHPA_W0PAUHWND__@@@Z

    請搜尋 DependencyWalker 來用,自 VS2008 以後要另外下載,只有 VS2005 以前才直接幫你安裝。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 oven425 2010年1月27日 上午 06:54
    2010年1月25日 下午 04:45
  • 一般GetProcAddress函數可以用來取得DLL中C函數的位址, 不是類別的方法的位址, 如果要取得類別方法的位址, 可以先製作一個轉呼叫類別方法的C函數, 再透過GetProcAddress函數取得該C函數的位址.
    • 已標示為解答 oven425 2010年1月27日 上午 06:54
    2010年1月27日 上午 04:24

所有回覆

  • 你先把你要呼叫的 DLL 類型分清楚吧。
    函數庫 / 類別庫 / .Net Managed 類別庫
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年1月19日 下午 03:23
  • 我想我做的DLL跟.NET是無關的
    我有用Win32專案去做DLL
    只要在建立專案的過程中
    勾選了Export Symbol以後
    建立出來的專案就跟C++類別一樣
    如果是說設定專案案的屬性來使用的話
    那跟一般的類別是一樣的
    以前我所使用過的DLL都只是一個個function而已
    這種類型的我也是頭一次碰到

    但是我所欲到的問題是動態載入這個DLL是OK的
    但是卻不曉得怎麼使用它,跟一般宣告函式行以後再轉來轉去的好像不一樣
    所以我才會問說在動態載入的DLL的要求下
    要如何使用
    2010年1月20日 上午 12:57
  • 函數庫沒有類別這種東西,需要宣告類別的是 COM 類別庫,有可能裡面還有靜態的 Function 。

    所以請先把你引用的 dll 搞清楚是什麼型態。

    VS 附了很多 dll 觀看函數的工具,先拿來玩玩搞清楚你的東西是啥。

    如果你用的是 VS2008 ,微軟已經沒有再提供原先的工具了,在網路上搜尋:Dependency Walker ,這是專門看函數型的 dll 。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 oven425 2010年1月27日 上午 06:54
    2010年1月20日 下午 03:46
  • 相關既有討論:
    http://www.google.com.tw/search?hl=zh-TW&q=Dependency+Walker+site%3Asocial.msdn.microsoft.com%2FForums%2Fzh-TW%2F&meta=&aq=f
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年1月20日 下午 03:46
  • HI,

    如果程式直接呼叫DLL中的功能是OK的, 但是LoadLibrary後再GetProcAddress卻失敗, 可能要查一下LoadLibrary的傳回值, 看是否執行成功? 如果有成功, 應該就是GetProcAddress函數呼叫的寫法有問題
    2010年1月21日 上午 08:38
  • 大家都沒有遇過這樣的問題喔
    還是我把我做的DLL給各位大大試試看
    以下是BDG的下載網址
    http://www.badongo.com/file/19995074
    裡面有這個DLL整個的檔案
    跟編譯出來的DLL和Lib檔

    請幫忙看看這樣要怎樣做動態的載入

    2010年1月25日 上午 05:20
  • 因為你沒有宣告別名,你的進入點是這樣:
    ??0Cwin32class@@QAE@XZ
    ??4Cwin32class@@QAEAAV0@ABV0@@Z
    ?fnwin32class@@YAHXZ
    ?getwin32classname@Cwin32class@@QAEXPA_W@Z
    ?nwin32class@@3HA
    ?showwin32class@Cwin32class@@QAEHPA_W0PAUHWND__@@@Z

    請搜尋 DependencyWalker 來用,自 VS2008 以後要另外下載,只有 VS2005 以前才直接幫你安裝。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 oven425 2010年1月27日 上午 06:54
    2010年1月25日 下午 04:45
  • 別名也有很多既有討論:
    http://www.google.com.tw/search?hl=zh-TW&source=hp&q=dll+%E5%88%A5%E5%90%8D+site%3Asocial.msdn.microsoft.com%2FForums%2Fzh-TW%2F&meta=&aq=f
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年1月25日 下午 04:46
  • 感謝大大的回覆
    但是我還是不懂別名要怎麼修正
    一般直接使用
    extern "C"
    {
    int __declspec add(void);
    }
    一般的DLL是這樣寫就可以拿到正確的別名了
    但是如果是把函式宣告在class裡面的話
    就沒有辦法這樣改
    因為改了編譯就不會過了
    而且類別本身就已經定義為__declspec(export)了

    謝謝
    2010年1月26日 上午 01:30
  • 我在您的專案中找不到
    extern "C"
    {
    }

    這樣的語法...

    還有, 您的GetProcAddress的呼叫語法是怎麼寫的?
    2010年1月26日 上午 03:54
  • this大大
    您說的真好,我就是想不出來GetProcAddress的呼叫語法
    所以才覺得很怪

    雖然在專案裡面是用__decldpec(dllexport)把整個類別包起來
    如果您用一般編譯的時候就靠屬性設定的方法載入
    那用法就跟一般類別是一樣的

    這也是我覺得很奇怪的DLL
    2010年1月26日 下午 04:17
  • 一般GetProcAddress函數可以用來取得DLL中C函數的位址, 不是類別的方法的位址, 如果要取得類別方法的位址, 可以先製作一個轉呼叫類別方法的C函數, 再透過GetProcAddress函數取得該C函數的位址.
    • 已標示為解答 oven425 2010年1月27日 上午 06:54
    2010年1月27日 上午 04:24
  • 那我就在努力吧
    謝謝各位大大的回覆
    2010年1月27日 上午 06:52