Delphi高手求救!

无响应 2006-10-26 10:00:20
各位大哥大姐,你们好,小弟又遇到麻烦了,求救!
现有VB程序,转化为Delphi,如下:
vb中用到的两个动态连接库:
Public Declare Function CAN_Recv Lib "k8110.dll" (ByVal iIndex As Long, ByRef ibyte As Any, ByVal rtimeout As Long) As Boolean
Declare Function CAN_Enable_Interrupt Lib "k8110.dll" (ByVal iIndex As Long, ByVal kind As Long, ByVal pf As Long) As Boolean
要转换的语句:

Call CAN_Enable_Interrupt(0, 2, AddressOf aaa)

Sub aaa()
Dim j As Long
Dim i As Byte
Dim rxdlc As Byte
If (CAN_Recv(mindex, canbuff(0), 20)) Then
.
.
.
End Sub
问题出现在AddressOf 这个运算上。
...全文
158 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
王集鹄 2006-10-26
  • 打赏
  • 举报
回复
function CAN_Recv (const iIndex: Longint; const ibyte; rtimeout: Longint): boolean; stdcall; external 'k8110.dll';
function CAN_Enable_Interrupt(const iIndex: Longint; kind: Longint; const pf: Longint): boolean; stdcall; external 'k8110.dll';

procedure aaa(); stdcall;
begin
// CAN_Recv(mindex, canbuff(0), 20);
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
CAN_Enable_Interrupt(0, 2, Integer(@aaa));
end;
无响应 2006-10-26
  • 打赏
  • 举报
回复
还没有调通,大家帮忙!
无响应 2006-10-26
  • 打赏
  • 举报
回复
xixuemao(散分是一种美德~接分是一种责任~)
您好,在vb中就是调用sub aaa()这个过程,您说的回调函数能给写个示例吗?
谢谢!
无响应 2006-10-26
  • 打赏
  • 举报
回复
谢谢楼上的,我先调调,成功了告诉您,非常感谢!
xixuemao 2006-10-26
  • 打赏
  • 举报
回复
应该是定义一个回调函数吧
do2008 2006-10-26
  • 打赏
  • 举报
回复
然后你的程序这样写,

1.先写一个过程

procedure pro_aaa();
begin
//...
end;

2.修改你的函数:


procedure TForm1.aaa();

VAR
tt:TDllfun;//定义过程指针

begin
tt:=@pro_aaa;//获取上面过程的pro_aaa的指针
CAN_Enable_Interrupt(0, 2,tt);

.
.
.
CAN_Recv(mindex, canbuff(0), 20);
.
.
.
end;


基本上就是这样写法,楼主自行调试一下~~~
do2008 2006-10-26
  • 打赏
  • 举报
回复
你的DLL是用VC写的?

>>VC中:DLL文件中:
>>extern "C" __declspec(dllexport) BOOL __stdcall CAN_Enable_Interrupt(ULONG mindex,int >>kind,void (*pf)());

最后一个参数是函数指针,所以delphi中也要声明一个函数指针,

typedef
TDllfun = procedure;//相当于VC的 void (*pf)();

var
//Form1: TForm1;

Function CAN_Enable_Interrupt (iIndex :DWORD; kind :integer; pf: TDllfun):BOOL ;stdcall;external'k8110.dll';

//注意参数的类型VC的ULONG,在delphi中用DWORD,不必用Longint;
//VC中的BOOL,在delphi中,不要用boolean,而改为BOOL
无响应 2006-10-26
  • 打赏
  • 举报
回复
unsigned(僵哥(很恐怖,差点在梦中不想醒来)):
楼上的哥哥,我是刚接触Delphi,能帮着写个例子吗?
谢谢!
僵哥 2006-10-26
  • 打赏
  • 举报
回复
把那个参数的类型在Delphi当中改用Pointer,然后传参数的时候强行转换为Pointer就好了.
无响应 2006-10-26
  • 打赏
  • 举报
回复
VC中:
DLL文件中:
extern "C" __declspec(dllexport) BOOL __stdcall CAN_Enable_Interrupt(ULONG mindex,int kind,void (*pf)());

VC中使用:
public:
void (*pf)();
void CK8110TestDlg::OnIsrReceive()
{
CString strtmp;

m_ctrlIndex.GetWindowText(strtmp);

CAN_Enable_Interrupt(atoi(strtmp),2,pf);

GetDlgItem(IDC_CHECK_RECEIVE)->EnableWindow(FALSE);
GetDlgItem(IDC_ISR_RECEIVE)->EnableWindow(FALSE);
GetDlgItem(IDC_ISR_DISABLE)->EnableWindow(TRUE);
}

VB和VC都可以成功,就差Delphi,欢迎大家提供意见,谢谢!
无响应 2006-10-26
  • 打赏
  • 举报
回复
我的Delphi中:
function CAN_Recv (const iIndex :Longint; const ibyte;rtimeout :Longint):boolean;stdcall;external'k8110.dll';
Function CAN_Enable_Interrupt (const iIndex :Longint; kind :Longint; const pf: Longint):boolean ;stdcall;external'k8110.dll';

VAR
tt:^longint;
tt:=@aaa;\\编译出错!
CAN_Enable_Interrupt(0, 2,tt^);
procedure TForm1.aaa();
begin
.
.
.
CAN_Recv(mindex, canbuff(0), 20);
.
.
.
end;

出错!请高手帮我转化一下,谢谢!
无响应 2006-10-26
  • 打赏
  • 举报
回复
CSDN中:
AddressOf 运算符
一个一元运算符,它将其后面的过程的地址传递给一个 API 过程,该 API 过程在参数表对应位置中需要一个函数指针。
语法
AddressOf procedurename
必需的 procedurename 指定要传递的地址是哪一个过程的地址。这个过程必须是发出调用命令的工程中的一个标准模块模块里的一个过程。

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧