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

用Delphi呼叫C++ DLL的問題(已爬文)

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


發表:1
回覆:0
積分:0
註冊:2010-10-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-10-15 11:05:13 IP:60.250.xxx.xxx 訂閱
各位好!
小弟最近在Delphi呼叫C 的DLL遇到了一點問題,
目前我手上有C 的範例(讀卡機相關的程式),也可以跑,
我已爬了一些版上的文,以及網路上的文,
參考:http://www.drbob42.com/delphi/headconv.htm
成功的將C 範例,改成用Delphi呼叫的版本,
但是在一開始的Port連線就遇到問題,
不知為啥,一直無法連線成功(用C 是可以連的,所以排除是硬體問題)
我自己覺得有可能是我傳入值的方式錯誤,
但是一直無法試出到底哪裡有問題,
請高手大大幫忙看一下,
底下是Delphi的片段:

[code delphi]
procedure TForm1.Button1Click(Sender: TObject);
var
Hbar:THandle;
CommOpen : function(hCom:Pointer ;com_port: PChar):apiStatus; stdcall; //這是我要連Com port的 function
SetBaudRate: function(hCom:THandle;BaudRate:DWord; ReaderAddr:Byte):apiStatus; stdcall;
begin
Hbar:= LoadLibrary('Mr915ApiV10.DLL');
IF Hbar >= 32 then { success }
Begin
CommOpen := GetProcAddress(HBar, 'CommOpen');
SetBaudRate := GetProcAddress(HBar, 'SetBaudRate');
//=============使用函數
//i:= CommOpen(addr(hComHandle),pc);
IF (CommOpen(addr(hComHandle),PChar('COM9')) <> 0) THEN //這是連Com Port的地方,一直傳回-3(已確認ComPort是COM9)
Begin
Label1.Caption := 'Connect Failure!';
End
ELSE
Begin
Label1.Caption := 'Connect Success!';
End;

if (SetBaudRate(hComHandle,115200,255)<>0)then
begin
Label2.Caption := 'BaudRate set Failure!';
end
else label2.Caption := 'BaudRate Set Success!';

//====================
FreeLibrary(HBar);
FreeLibrary(hComHandle);
End
Else
MessageDlg('Error: could not find Mr915ApiV10.DLL', mtError, [mbOk], 0)
end;
[/code]

這是C .h檔的片段
[code cpp]
typedef struct
{
unsigned char TagType;
unsigned char AntNum;
unsigned char Ids[12];
}TagIds;
typedef short apiStatus;

apiStatus __declspec(dllexport) __stdcall CommOpen (HANDLE * hCom, char *com_port);
[/code]

附件附上原始碼的檔案,
請高手大大指教!
非常感激~





附加檔案:4cb7c4e8ef3f7_Reader.rar
rick060
高階會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-08-12 10:45:25 IP:60.250.xxx.xxx 未訂閱
猜測。

照你附上的 .h ,沒有 extern "C"
那就是 c mangling 的問題
vc 以外想要 call 只有去找出真正的名字

用 dumpbin 或 Dependency Walker 查看實際 function name

dumpbin 出來如下:
1 0 0001113B ?fndllTest@@YAHXZ = @ILT 310(?fndllTest@@YAHXZ)

則 delphi 需使用已被 mangling 過的名字
module := LoadLibrary('dllTest.dll');
funcEntry := GetProcAddress(module,'?fndllTest@@YAHXZ');
funcEntry;
系統時間:2017-11-18 19:56:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!