哪位兄弟知道“EnumPorts”这个API函数在哪个单元文件中。
我找了很久都没找到相关资料。就在VC下写了一个DLL,可是DELPHI调用后地址报错。
哪位高人能给一个DELPHI调用VC写的DLL的例子。
哦。下午找齐了资料,写了一个DELPHI调用VC编写的DLL文件检测串口可用性的测试程序。算是搞定了。如果大家有什么好的方法可以帖上来。我把下午写的代码帖上去与大家分享。呵呵
[此贴子已经被作者于2006-12-2 16:47:28编辑过]
哪位兄弟知道“EnumPorts”这个API函数在哪个单元文件中。
我找了很久都没找到相关资料。就在VC下写了一个DLL,可是DELPHI调用后地址报错。
哪位高人能给一个DELPHI调用VC写的DLL的例子。
哦。下午找齐了资料,写了一个DELPHI调用VC编写的DLL文件检测串口可用性的测试程序。算是搞定了。如果大家有什么好的方法可以帖上来。我把下午写的代码帖上去与大家分享。呵呵
[此贴子已经被作者于2006-12-2 16:47:28编辑过]
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.
那麽我們返回的結果要怎麽用呢?
每次调用一个函数时主程序在调用之前要将参数PUSH,调用完后要由子程序返回操作POP操作。_cdecal是由调用者把参数弹出栈,这种调用方式可以改变主调用程序的参数个数。而stdcall是被调用程序返回参数,所以他的主掉用程序的参数个数是固定的。
当你的参数个数可变时使用__cdecl,反之应该使用_stdcall。