注册 登录
编程论坛 Delphi论坛

[求助]DELPHI如何调用VC编写的DLL

sanjin 发布于 2006-12-02 10:36, 1456 次点击

哪位兄弟知道“EnumPorts”这个API函数在哪个单元文件中。
我找了很久都没找到相关资料。就在VC下写了一个DLL,可是DELPHI调用后地址报错。
哪位高人能给一个DELPHI调用VC写的DLL的例子。

哦。下午找齐了资料,写了一个DELPHI调用VC编写的DLL文件检测串口可用性的测试程序。算是搞定了。如果大家有什么好的方法可以帖上来。我把下午写的代码帖上去与大家分享。呵呵

只有本站会员才能查看附件,请 登录

[此贴子已经被作者于2006-12-2 16:47:28编辑过]

4 回复
#2
形影随从2006-12-05 14:10
呵!我也碰到這個問題目了,不過我的DLL文件就是用DELPHI編寫的,但是調用後把他SHOW出來時就報地址錯誤.
我跟蹤了一步一步的執行,發現可以返回我想回得到的結果,只是一把返回的變量賦值給其他變量或SHOW出來
時就會報錯了.如果有做其他動作的話就OK.但這樣的話我還不能用返回來的結果了.
那DLL文件返回的是PCHAR類型.
有知道怎麽處理這個問題的嗎?
樓主知道嗎?
Thanks!
#3
形影随从2006-12-05 14:25

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

function GetReelIDInfo(iReelID, oItem, oVendor, oDateCode, oLotCode, oItemDesc, oTQty, oMsg: Pchar): Integer; cdecl; external 'REELIDINFO.dll';

procedure TForm1.Button1Click(Sender: TObject);
var
iReelID, oItem, oVendor, oDateCode, oLotCode, oItemDesc, oTQty, oMsg: Pchar;
vRet: integer;
begin
iReelID := pchar(Edit1.Text);
GetMem(oItem, 1024);
GetMem(oVendor, 1024);
GetMem(oDateCode, 1024);
GetMem(oLotCode, 1024);
GetMem(oItemDesc, 1024);
GetMem(oTQty, 1024);
GetMem(oMsg, 2048);
vRet := GetReelIDInfo(iReelID, oItem, oVendor, oDateCode, oLotCode, oItemDesc, oTQty, oMsg);
Memo1.Lines.Add(iReelID);
Memo1.Lines.Add(oItem);
FreeMem(oItem);
Memo1.Lines.Add(oVendor);
FreeMem(oVendor);
Memo1.Lines.Add(oDateCode);
FreeMem(oDateCode);
Memo1.Lines.Add(oLotCode);
FreeMem(oLotCode);
Memo1.Lines.Add(oItemDesc);
FreeMem(oItemDesc);
Memo1.Lines.Add(oTQty);
FreeMem(oTQty);
Memo1.Lines.Add(oMsg);
FreeMem(oMsg);
Showmessage(IntToStr(vRet));
end;

end.


//上面是我寫的程源代碼.如果就這樣執行會報地址錯誤,如果把調用DLL文件函數後的全注釋掉就OK.
那麽我們返回的結果要怎麽用呢?

#4
形影随从2006-12-05 15:14
問題解決了.把:
function GetReelIDInfo(iReelID, oItem, oVendor, oDateCode, oLotCode, oItemDesc, oTQty, oMsg: Pchar): Integer; cdecl; external 'REELIDINFO.dll';
中的:cdecl換成stdcall就好了.
有能解釋一下這兩個各表示什麽意思嗎?都在什麽情況下使用呢?
#5
sanjin2006-12-18 15:33

每次调用一个函数时主程序在调用之前要将参数PUSH,调用完后要由子程序返回操作POP操作。_cdecal是由调用者把参数弹出栈,这种调用方式可以改变主调用程序的参数个数。而stdcall是被调用程序返回参数,所以他的主掉用程序的参数个数是固定的。
当你的参数个数可变时使用__cdecl,反之应该使用_stdcall。

1