線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2273
推到 Plurk!
推到 Facebook!

改寫VC的程式碼

答題得分者是:rick060
Solaris2005
一般會員


發表:7
回覆:13
積分:4
註冊:2003-05-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2012-11-14 09:41:00 IP:220.228.xxx.xxx 訂閱
最近在使用CCD, 但是原廠只有提供VC的source code, 以及.H, .LIB, .DLL檔
可是, 我沒寫過VC, 所以想改寫成BCB
我有點照本宣科的將原本的source code寫到BCB時
在呼叫到某一行時, 原本的記憶體位置就突然變成????
可是在VC上並不會, 是我在呼叫原本VC使用的LIB或是DLL的問題嗎?
我用coff2omf 也轉過了, 還是不行, 還有什麼原因, 是我可以努力的嗎?

程式碼:
if (AdvDVP_CreateSDKInstence)
{
if (AdvDVP_CreateSDKInstence((void **)&pDVPSDK) != SUCCEEDED)
return;
}
else
return;
int res = pDVPSDK->AdvDVP_InitSDK(); <<<到這裡時, pDVPSDK裡的所有function都還有記憶體位址
if (res == SUCCEEDED)
{
if (pDVPSDK->AdvDVP_GetNoOfDevices(&nDevCount) != SUCCEEDED) <<<< 這一行跑完之後, 所有的function address全部變成???
return;
jcjroc
高階會員


發表:21
回覆:276
積分:114
註冊:2002-09-18

發送簡訊給我
#2 引用回覆 回覆 發表時間:2012-11-14 19:45:16 IP:60.248.xxx.xxx 訂閱
DLL export class
別想跨Compiler使用,就算是同家公司的compiler也極大可能性不相容

Solaris2005
一般會員


發表:7
回覆:13
積分:4
註冊:2003-05-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2012-11-14 20:02:29 IP:219.87.xxx.xxx 訂閱
不好意思, 小弟才疏學淺
可是說的簡單一點嗎?
要怎麼做呢?
don750421
一般會員


發表:11
回覆:12
積分:4
註冊:2012-09-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2012-11-15 21:35:08 IP:114.47.xxx.xxx 訂閱
通常原廠使用的元件會針對某些開發工具
EX.
FOR BCB
FOR VC
FOR JAVA

在程式碼上更是明顯不同了,更別說Compiler...
舉例來說,VC 使用CString,在BCB則是使用AnsiString..

我最近也是剛從VC MFC轉BCB
很慶幸,當初寫的時候有考慮到可能會換工具..
所以盡可能使用string...
rick060
高階會員


發表:2
回覆:112
積分:217
註冊:2009-11-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2012-11-20 17:05:20 IP:114.32.xxx.xxx 訂閱
這麼說吧。
VC 做的 dll 能不能給 bcb 用?
答案是"有限度的允許"
需滿足下條件
其一
從 vc export 出來的 function / variable 都有前綴 extern "C" ,代表抑制 name mangling (參考 http://en.wikipedia.org/wiki/Name_mangling)
解法? 有
使用 vc DUMPBIN (參考 http://msdn.microsoft.com/en-us/library/c1h23y6c.aspx) 或 http://www.dependencywalker.com/
我記得版上有文是說明bcb與vc name mangling 之間的call convention
其二
資料型態只能使用 C Data types 的型別
解法? 有
1.把dll 裡的 function wrapper 成 COM 給 bcb 用
其三
若有使用到 pointer ,傳的是 struct(C),又要考慮到 align 問題(參考 http://en.wikipedia.org/wiki/Data_structure_alignment)
綜合以上,你可以參考你手上的 .h 看有無符合上述條件
若沒有,我是建議你從 vc 下手吧

===================引 用 Solaris2005 文 章===================
最近在使用CCD, 但是原廠只有提供VC的source code, 以及.H, .LIB, .DLL檔
可是, 我沒寫過VC, 所以想改寫成BCB
我有點照本宣科的將原本的source code寫到BCB時
在呼叫到某一行時, 原本的記憶體位置就突然變成????
可是在VC上並不會, 是我在呼叫原本VC使用的LIB或是DLL的問題嗎?
我用coff2omf 也轉過了, 還是不行, 還有什麼原因, 是我可以努力的嗎?

程式碼:
if (AdvDVP_CreateSDKInstence)
{
if (AdvDVP_CreateSDKInstence((void **)&pDVPSDK) != SUCCEEDED)
return;
}
else
return;
int res = pDVPSDK->AdvDVP_InitSDK(); <<<到這裡時, pDVPSDK裡的所有function都還有記憶體位址
if (res == SUCCEEDED)
{
if (pDVPSDK->AdvDVP_GetNoOfDevices(&nDevCount) != SUCCEEDED) <<<< 這一行跑完之後, 所有的function address全部變成???
return;
Solaris2005
一般會員


發表:7
回覆:13
積分:4
註冊:2003-05-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2012-12-05 15:23:05 IP:220.228.xxx.xxx 訂閱
是的, 最後的解決方式是用VC再包一層出來給BCB使用
省去很多麻煩!
系統時間:2017-10-19 0:49:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!