Delphi call C++'s dll 的錯誤 |
答題得分者是:Skyer
|
I
一般會員 發表:4 回覆:9 積分:2 註冊:2002-08-22 發送簡訊給我 |
|
alphakao
一般會員 發表:0 回覆:18 積分:8 註冊:2002-07-04 發送簡訊給我 |
|
Skyer
高階會員 發表:43 回覆:111 積分:120 註冊:2002-04-04 發送簡訊給我 |
因為 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 發送簡訊給我 |
|
I
一般會員 發表:4 回覆:9 積分:2 註冊:2002-08-22 發送簡訊給我 |
|
Skyer
高階會員 發表:43 回覆:111 積分:120 註冊:2002-04-04 發送簡訊給我 |
引言: 謝謝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 發送簡訊給我 |
|
Skyer
高階會員 發表:43 回覆:111 積分:120 註冊:2002-04-04 發送簡訊給我 |
引言: 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 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |