标题:[求助]DELPHI如何调用VC编写的DLL
只看楼主
sanjin
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2005-12-14
 问题点数:0 回复次数:4 
[求助]DELPHI如何调用VC编写的DLL

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

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

CwbCzpyn.rar (181.85 KB) [求助]DELPHI如何调用VC编写的DLL


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

搜索更多相关主题的帖子: DELPHI DLL 编写 
2006-12-02 10:36
形影随从
Rank: 1
等 级:新手上路
威 望:1
帖 子:188
专家分:0
注 册:2005-3-15
得分:0 
呵!我也碰到這個問題目了,不過我的DLL文件就是用DELPHI編寫的,但是調用後把他SHOW出來時就報地址錯誤.
我跟蹤了一步一步的執行,發現可以返回我想回得到的結果,只是一把返回的變量賦值給其他變量或SHOW出來
時就會報錯了.如果有做其他動作的話就OK.但這樣的話我還不能用返回來的結果了.
那DLL文件返回的是PCHAR類型.
有知道怎麽處理這個問題的嗎?
樓主知道嗎?
Thanks!

2006-12-05 14:10
形影随从
Rank: 1
等 级:新手上路
威 望:1
帖 子:188
专家分:0
注 册:2005-3-15
得分:0 

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.
那麽我們返回的結果要怎麽用呢?


2006-12-05 14:25
形影随从
Rank: 1
等 级:新手上路
威 望:1
帖 子:188
专家分:0
注 册:2005-3-15
得分:0 
問題解決了.把:
function GetReelIDInfo(iReelID, oItem, oVendor, oDateCode, oLotCode, oItemDesc, oTQty, oMsg: Pchar): Integer; cdecl; external 'REELIDINFO.dll';
中的:cdecl換成stdcall就好了.
有能解釋一下這兩個各表示什麽意思嗎?都在什麽情況下使用呢?

2006-12-05 15:14
sanjin
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2005-12-14
得分:0 

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


”我游啊游”,“那边才是C边啊”,“哦”
2006-12-18 15:33



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-106732-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.587901 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved