看板 C_and_CPP 關於我們 聯絡資訊
有一個疑問 因為跟dll產生方式不是很熟 一般我看教學文件 或是 VC的dll template 都是在要export的method or variable 前面冠上 __declspec(dllexport) 就連class or struct也是 但衍伸了一些問題 1. 我知道可以用LoadLibrary + GetProcAddress來動態使用 可是如果我只有對方的dll (沒有.h and .lib) 我該怎麼把 例如 MyType API(MyType2* obj); 給 load回來 因為我並沒有.h 我根本不知道MyType是什麼 這樣就很矛盾 我冠上 __declspec(dllexport)在struct前面要幹嘛? 除非對方有.h , 但有了.h 就不用寫 __declspec(dllexport)了吧? 這個struct都認得到了 所以問題可以變成 : __declspec(dllexport) 冠在class or struct 的用途是? 還是不寫上去run time會出問題 2. 我常常會看到有人export dll 搭配一個.def檔案 這很怪....def會記錄你export那些symbol 可是... 我還是不知道你的function prototype 我要怎麼使用你dll export的method.. .def給我的理解似乎是 你要是在.def裡面寫的symbol 就不用再code裡面冠上 __declspec(dllexport) 但.def真正的用途 是什麼 我實在不知道 若只是一個export API list....那我用dumpbin自己看就可以了 像是sqlite 他也只提供.dll + def... http://www.sqlite.org/download.html Precompiled Binaries For Windows 比較好奇我不去偷看他.h 我怎麼可能會知道該怎麼invoke他的API 這樣看來 還是把.h .lib + dll 都給會最方便...這有甚麼缺點嗎? 除了program被載入需要花時間load dll外? 3. VC的dll template可以勾選 要不要export symbol.... 我比較納悶的是 不溝的話 那這dll要幹嘛? 你不export symbol 那dll還有甚麼用途嗎 以上是我測試後 引發的一些疑惑跟想法 請各位有經驗的板友提供點意見 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.192.138.160
purpose:只有 dll 沒有 lib 就乖乖用 GetProcAddr 當然網路上也有 05/31 00:06
purpose:好幾篇教你怎麼自己產生 lib 的攻略但那只是土法煉鋼而已 05/31 00:08
QQ29:但沒有.h 我不知道該怎麼轉function pointer.. 05/31 00:11
QQ29:p大連結裡好像有講? 需要這麼精妙的去找喔 ? 05/31 00:13
diabloevagto:不需要產生lib啊,你直接放dll近來,要怎樣使用 05/31 00:19
diabloevagto:給你dll的人本來就應該要給你了 05/31 00:20
diabloevagto:至少我在用dll的時候,compiler那根本不用加什麼 05/31 00:20
diabloevagto:只要我在runtime能夠找到dll就好 05/31 00:21
diabloevagto:你給的那個網站裡面有api可以參考 05/31 00:23
diabloevagto:http://www.sqlite.org/c3ref/intro.html 05/31 00:23
diabloevagto:從這裡面找就知道你要用api要怎樣使用了 05/31 00:23
diabloevagto:正常寫的ok的doc是讓你沒有必要再去看code的 05/31 00:25
diabloevagto:我用opencv一段時間了,從來沒有去看過他的code 05/31 00:25
diabloevagto:我覺得這樣的doc就寫的滿不錯的,挺清楚的 05/31 00:25
QQ29:__declspec(dllexport) 所以這個是for implicit link那種 05/31 00:26
QQ29:lib .h .dll都給你一起compile的時候用的嗎? 05/31 00:26
QQ29:d大說都不加就可以用 也是用getprocaddress? 05/31 00:27
QQ29:但是沒.h 他自訂的type我怎麼用阿? 我問題1的疑惑 05/31 00:27
purpose:不知道 MyType 是什麼,卻想要使用這個函數,是要怎麼填寫 05/31 00:33
purpose:引數 obj 的內容,這不是異想天開嗎 05/31 00:33
diabloevagto:GetProcAddress沒錯 05/31 00:39
diabloevagto:http://ideone.com/bUdzw 之前測試用的 05/31 00:40
diabloevagto:重點是之前的LoadLibrary要成功load進來就好 05/31 00:41
QQ29:@p大 就是不知道這是啥 沒給.h的話不就不能用了嗎 05/31 00:42
QQ29:@d 大 所以cv::Mat 這還是要有.hpp才能知道這型態吧? 05/31 00:43
QQ29:d大 compile不用加甚麼應該是.h 有寫__declspec(dllimport) 05/31 00:45
QQ29:的macro? 05/31 00:46
purpose:沒給 .h 不一定不能用某個 dll 匯出函數,前提是你知道其 05/31 01:01
purpose:每個引數填什麼,大小多大,而 MyType 顯然未知大小與內容 05/31 01:02
diabloevagto:我編出dll跟使用dll的是兩個不同的project 05/31 01:05
diabloevagto:.h不會混著用,我不懂為什麼你這麼堅持在.h上? 05/31 01:06
diabloevagto:因為我使用opencv的型態所以我一定要include opencv 05/31 01:07
diabloevagto:的才了解那個型態是什麼,如果你用內建的型態就不用 05/31 01:07
diabloevagto:include任何東西,包涵你build dll的也不用 05/31 01:07
diabloevagto:基本上你要使用額外的lib並且有用到特定的型態就要 05/31 01:08
james732:很想建議原PO實際上建個DLL,再寫個Client端程式使用它 05/31 01:08
diabloevagto:include那個lib的東西,但這跟你使用別的dll是不相 05/31 01:09
james732:這些觀念只要動手做過一次,就會知道怎麼回事了吧... 05/31 01:09
diabloevagto:關的東西,基本上你直接google關於dll的 05/31 01:09
diabloevagto:資料就一大堆了 05/31 01:09
purpose:很想建議原PO買本程式設計師的自我修養,裡面就已經完整講 05/31 01:10
diabloevagto:你如果只有dll就是要用runtime-linking 05/31 01:10
purpose:問題是你好像已經有書了 05/31 01:11
diabloevagto:你有.lib是用compiler linking 05/31 01:11
diabloevagto:不太知道這兩個名詞對不對,不過我表達compiler 05/31 01:11
james732:他一定有<自我修養>,問過好幾次書上的問題了XD 05/31 01:11
diabloevagto:跟runtime使用dll時機的不同 05/31 01:12
diabloevagto:那本書不太好懂,講了滿多底層的東西... 05/31 01:12
diabloevagto:但那本還是滿不錯的一本書 05/31 01:13
QQ29:其實我就是看到她第七章...才問的orz 05/31 11:01
QQ29:大家講的我都了解 只是我不懂的是問題1, 我看sqlite只給def和 05/31 11:01
QQ29:dll 為啥不給.h... 我可以用指令產生.lib 可是還是要拿.h阿 05/31 11:02
james732:.h檔只會在編譯的時候用到,載入的時候它不是必要的 05/31 11:09
diabloevagto:我上面已經回你一堆了= = 05/31 12:52
diabloevagto:你跟本部需要知道.h檔,他網站就有給你api ref了 05/31 12:53
diabloevagto:從中找到的東西就跟你.h一樣,而且更為詳細 05/31 12:53
diabloevagto:你在裡面就能找到他function怎麼用,回傳是什麼型態 05/31 12:53
diabloevagto:你有用到他特殊的型態才要.h或.lib 05/31 12:54
diabloevagto:如果他自己的型態只有在他的dll內用到,你不需要碰到 05/31 12:55
diabloevagto:那你就不用他的.h那些,反正你c++原本就認得了 05/31 12:55
diabloevagto:建議你自己包個dll然後程式call,你會清楚很多的 05/31 13:03
purpose:sqlite 連原始碼都給你了,裡面就有 .h 05/31 15:33
Arton0306:我用到的lib是都有header檔 若你用的沒header 會不會是 05/31 15:34
Arton0306:它有doc 它要你自己打?? 05/31 15:34
james732:看原PO的回覆,真的不太像有實際動手操作過 05/31 20:20
QQ29:我只是很好奇有沒有只有dll又可以用他自訂type的方法 05/31 22:28
QQ29:不然sqlite應該直接包入.h在zip才是 05/31 22:29
QQ29:結果還是要去找.h來build.. 05/31 22:30