精華區beta CSSE 關於我們 聯絡資訊
※ 引述《tinlans ( )》之銘言: : 另外,也應該盡早學會 DLL 或 shared object 應用在 OO 上的技巧, : 一大堆人到了進去業界才知道 executable file 只要看到 base class, : 就能直接透過 dynamic binding 機制 call 到 dynamic library 中 : derived classes 內的 virtual functions, : 而反過來說, : 當 dynamic library 內的 source code 不可見, : 但其 header files 提供 base classes 的定義式時, : 使用 library 的人就可以透過繼承機制去 reuse 現有但不可見的 code。 : 只不過,書很少會講這種東西, : 也不會有講 OO design pattern 的書跟你說 factory 可以配這東西玩。 請問一下這樣的機制是否就類似 M$ 的 COM 呢? 如 ap 可以利用 interface pointer (or base class pointer) 去操作放在 COM DLL 之中的實作品 另外如果自己玩這機制 不知對於 C++ 編譯器產生的命名問題,有什麼好的解法嗎? 我指的是使用不同/不同版本的編譯器所編出來的 DLL 其 export 出來的 class name (好像是叫 name mangling 問題) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.228.207.96
tinlans:我的主要工作平台不在 MS 上所以沒辦法回答你 COM 的部份 01/08 16:43
tinlans:mangling 的問題,不同 compiler 編譯出來不一定會通 01/08 16:46
tinlans:光是 GCC 自己 2.x -> 3.x 編譯出來的都不通了,解法我也 01/08 16:47
tinlans:沒去研究 01/08 17:02
nvfp:無解吧, 每家各做各的沒個標準 0rz 01/08 17:43
UNARYvvv:或者我該換個問法。所謂直接透過動態繫結使用 DLL 內的 01/08 20:44
UNARYvvv:derived class 而又不受限於 mangling 問題的話,一般是 01/08 20:45
UNARYvvv:否是使用一個 extern "C" GetXXXObjectPointer() 傳回一 01/08 20:46
UNARYvvv:個新的 derived class pointer,然後指派給 ap 中的那個 01/08 20:47
UNARYvvv:base class pointer 以便來進行 polymorphism ? 01/08 20:48
tinlans:理論上是可以這樣做沒錯,但不同 compiler 間也還存在著 01/08 20:52
tinlans:calling convention 的不同,所以就算是純 C 寫碰到這種情 01/08 20:53
tinlans:形也一樣會掛。 01/08 20:53
tinlans:只不過,存在已久的 platform 本身就會規範好標準讓大家遵 01/08 20:59
tinlans:循,可是如果是在亂七八糟或很新的 platform 上,就沒輒了 01/08 20:59
UNARYvvv:謝謝,我剛才倒是忘了考慮 calling convention 的問題 01/08 22:11
UNARYvvv:所以我要這樣玩還是盡量 ap 和 DLL 都用同一套 compiler 01/08 22:11
UNARYvvv:來編就沒那些麻煩問題了 (當然compiler也該用同版本) 01/08 22:12
godfat:所以我們需要 n1496 ? 01/08 22:18
godfat:www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1496. 01/08 22:19
godfat:html 縮:http://rubyurl.com/8ap 01/08 22:19