Re: [問題] 自製DLL的struct問題

作者: EdisonX (卡卡獸)   2015-06-25 01:08:24
剛好我也什麼都不懂,討論一下。
※ 引述《petercoin (彼得幣)》之銘言:
< 恕刪 >
: 在IO.h內定義一個struct如下
: typedef struct _ReadData
: {
: char *A;
: int B;
: ...
: } READDATA;
< 恕刪 >
: 我目前想到的方法是重新在MyDll.h內定義一個名字不一樣但是內容一樣的struct
: 例如
: typedef struct _ReadData1
: {
: char *A;
: int B;
: ...
: } READDATA1;
先提關鍵字 : dllexport , dllimport , 重點就這兩個 。
用同一份程式碼,配合 macro define 切換,以下贅述憑印象,請自行抓重點,
若有誤也請不吝指正。
作者: petercoin (彼得幣)   2015-06-25 09:13:00
意思是說只要有dllexport的struct 就算不放在IO.h而只放在MyDll.h 一樣可以直接在IO.cpp裡面使用是嗎?我目前是用VC 但是exe跟dll是不同solutionMyDll.cpp只提供Set或Get的介面 功能的實作在IO.cpp所以才會有struct要共用的問題QQ
作者: uranusjr (←這人是超級笨蛋)   2015-06-25 11:50:00
這是正解, 然後樓上你需要的應該是宣告在 IO.h, 然後在MyDLL.h 加上 #include "IO.h"
作者: Feis (永遠睡不著 @@)   2015-06-25 12:07:00
其實重點就是在於 MyDLL.h 要不要 include 其他人的問題跟這篇的重點其實不太一樣. (我是說原 po 的疑問)要 include 的話, 就不會有原 po 的問題.接著才是 dllimport 跟 dllexport 的問題還是說其實是我理解有問題 Orz..
作者: petercoin (彼得幣)   2015-06-25 12:23:00
其實我的問題是如果寫在IO.h 那使用dll的人如何知道這個struct的內容有什麼?因為我只打算把MyDll.h丟給使用者 不打算公開IO.h
作者: Feis (永遠睡不著 @@)   2015-06-25 12:25:00
我理解阿. 你要 include 其他人就是要把其他人拿進來你不想的話要怎麼辦. 這才是你的問題.我的意見就是要嘛把 A.h 給別人. 要嘛就包起來
作者: petercoin (彼得幣)   2015-06-25 12:27:00
還是乾脆把STRUCT寫成註解放在MyDll.h...XD
作者: Feis (永遠睡不著 @@)   2015-06-25 12:27:00
如果你連 A.h 都不想給別人. 那要說明一下理由寫成註解有甚麼意義嗎 ?
作者: petercoin (彼得幣)   2015-06-25 12:30:00
因為我只想讓使用者知道有什麼function可以用 但是我不想讓他知道其他在實作上的任何相關內容 所以才不想放額外的檔案出去QQ
作者: Feis (永遠睡不著 @@)   2015-06-25 12:31:00
A.h 不是只有共用的 struct 嗎 ?還是你連 struct 內部有甚麼成員都不想讓別人知道 ?
作者: petercoin (彼得幣)   2015-06-25 12:31:00
阿不好意思 我把A.h跟IO.h搞混了 照你的意思就是把共用的struct放A.h裡面 最後把A.h跟MyDll.h都丟給使用
作者: Feis (永遠睡不著 @@)   2015-06-25 12:32:00
我以為之前那篇就是這意思 XD
作者: petercoin (彼得幣)   2015-06-25 12:32:00
者 然後MyDll.h裡面include A.h這樣對吧?上一篇你回的我有看懂啦 只是剛剛一時之間沒切換過來
作者: Feis (永遠睡不著 @@)   2015-06-25 12:33:00
然後你還需要看一下這篇了解一下 dllimport 跟 dllexport
作者: petercoin (彼得幣)   2015-06-25 12:37:00
了解 不過IO_API加在struct上的用意其實我不是很了解QQ
作者: Feis (永遠睡不著 @@)   2015-06-25 12:37:00
那你先研究一下 DLL 是怎麼運作的.
作者: petercoin (彼得幣)   2015-06-25 12:41:00
了解 目前也只是寫出可以用的 但是運作還不是很熟悉整個是被公司趕鴨子上架要做出成品Orz
作者: Feis (永遠睡不著 @@)   2015-06-25 12:43:00
不要被煮熟就好~
作者: petercoin (彼得幣)   2015-06-25 12:58:00
會繼續努力研究 有問題再來勞煩大家了!!
作者: EdisonX (卡卡獸)   2015-06-25 15:08:00
額 原來我又跑題了 orz
作者: petercoin (彼得幣)   2015-06-25 15:15:00
E大 不會啦 你剛好提到一個我沒有注意過的 我會研究研究看這中間的差別是什麼
作者: uranusjr (←這人是超級笨蛋)   2015-06-25 15:40:00
其實還有一個方法是用 opaque pointer,DLL 只提供一個READDATA * 宣告, 然後提供 function 讀寫所有欄位內容這樣 DLL 使用者就根本不需要知道 struct 內容了

Links booklink

Contact Us: admin [ a t ] ucptt.com