全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1690
推到 Plurk!
推到 Facebook!

Delphi call C++'s dll 的錯誤

答題得分者是:Skyer
I
一般會員


發表:4
回覆:9
積分:2
註冊:2002-08-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-08-22 12:42:33 IP:203.70.xxx.xxx 未訂閱
請問用delphi call C 's dll時, 出現"無法找到輸入程序點xxxx in xxxxx.dll", 但在C 環境執行卻又一切正常, 請問這可能是什麼原因?
alphakao
一般會員


發表:0
回覆:18
積分:8
註冊:2002-07-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-08-22 18:13:18 IP:61.220.xxx.xxx 未訂閱
有些C 的 DLL Funtion Name 會加底線 看Function Name 有沒有跟 DLL 的一樣 而 C 內定 cdecl Delphi 內定是 fastcall 再看看 Calling Convention 的 Directive 有沒有設對
Skyer
高階會員


發表:43
回覆:111
積分:120
註冊:2002-04-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-08-23 01:10:06 IP:61.30.xxx.xxx 未訂閱
因為 C++ 有函式的多載,所以 Compiler 會在 Function 動些手腳 讓 Delphi 認不出來..    解決方法:   方法 1.  在 DLL Export 地方加上 extern "C"        像:       
extern "C" {
  your functions
}
      
方法 2. 在 Delphi 這裡,使用 index 來指出位置 像: interface procedure SomeFuncs; stdcall; imprementation procedure SomeFuncs; external 'xxx.dll' index 1 -- Skyer
------
--
Regards,
Skyer
I
一般會員


發表:4
回覆:9
積分:2
註冊:2002-08-22

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-08-23 10:10:38 IP:203.70.xxx.xxx 未訂閱
謝謝alphakao, 不過我檢查過Function Name and Calling Convention都沒有錯......
I
一般會員


發表:4
回覆:9
積分:2
註冊:2002-08-22

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-08-23 10:31:50 IP:203.70.xxx.xxx 未訂閱
謝謝Skyer, 我用你說的第二種方法(用index),但是我不太清楚呼叫該function時要如何寫......
Skyer
高階會員


發表:43
回覆:111
積分:120
註冊:2002-04-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-08-23 16:35:27 IP:211.23.xxx.xxx 未訂閱
引言: 謝謝Skyer, 我用你說的第二種方法(用index),但是我不太清楚呼叫該function時要如何寫......
可以先用 tdump 看看 dll 的 Export Section 看要呼叫的 Function 的編號.. 我節選 FreeImage.DLL 部份內容
Exports from FreeImage.dll
  150 exported name(s), 150 export addresse(s).  Ordinal base is 1.
  Sorted by Name:
    RVA      Ord. Hint Name
    -------- ---- ---- ----
    000102A5    1 0000 _FreeImage_Allocate@24
    0000F28B    2 0001 _FreeImage_AppendPage@8
    000103B1    3 0002 _FreeImage_Clone@4
    0000EF65    4 0003 _FreeImage_CloseMultiBitmap@4
可看到函式名稱後面被加東西了.. 而 Ord. 欄位就是我們要的東西了.. 把那個東東放在 index 後就可以了.. 使用方式: 建議新增一個 Unit 專門放 DLL 的 Function Declaration
Unit DllDef    interface
function FreeImage_Allocate(width, height, bpp: Integer; red_mask: Cardinal = 0; green_mask: Cardinal = 0; blue_mask: Cardinal = 0): Pointer; stdcall;
  ...
  ...
implementation
function FreeImage_Allocate(width, height, bpp: Integer; red_mask: Cardinal = 0; green_mask: Cardinal = 0; blue_mask: Cardinal = 0): Pointer; external 'FreeImage.DLL' index 1;
   ...
   ...
end.
這樣,以後直接 use 這個 unit 就可以直接用了... -- Skyer
------
--
Regards,
Skyer
I
一般會員


發表:4
回覆:9
積分:2
註冊:2002-08-22

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-08-23 17:54:55 IP:203.70.xxx.xxx 未訂閱
Skyer: 真是高手,用tdump看function name, 果然前後被加上一些奇怪的碼, 直接使用index後已成功。 只是...... 你知道為什麼function name前後會有那些奇怪的碼嗎? 百思不解@*&!$%
Skyer
高階會員


發表:43
回覆:111
積分:120
註冊:2002-04-04

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-08-24 00:37:43 IP:211.23.xxx.xxx 未訂閱
引言: Skyer: 真是高手,用tdump看function name, 果然前後被加上一些奇怪的碼, 直接使用index後已成功。 只是...... 你知道為什麼function name前後會有那些奇怪的碼嗎? 百思不解@*&!$%
印象中.. 因為 C Plus Plus 有函式的 overload (多載) 所以同樣一個函式名稱可能有很多實體 像這樣
  void Func1(int ANum);
  void Func1(char *AStr);
  void Func1(float AFloat);
所以 C Plus Plus Compiler 會幫我們管理 (即會在後面加上怪怪的東西)
  _Func1@xx
  _Func1@yy
  _Func1@zz
-- Skyer
------
--
Regards,
Skyer
系統時間:2024-04-27 6:30:06
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!