急!急!关于AD/DA卡的使用中DLL调用问题(50分)

  • 主题发起人 主题发起人 shy_cm
  • 开始时间 开始时间
S

shy_cm

Unregistered / Unconfirmed
GUEST, unregistred user!
最近在用BH5104采集卡时遇到难题,不知如何解决。请高手不吝赐教。
其DLL的Driver.h文件中定义为
DEVAPI BOOL FAR PASCAL OpenSetupDlg(CWnd *pParent,PPARA pParameter);
// 参数设置对话框(自动读取和保存参数值)
其中pParent指向父窗口,类型在VC中的窗口类指针,VB中应以Null作参数,
并说明此函数必须在的CWnd类的继承中使用或者通过一定方法能获取CWnd类的指针也可以在CWnd的继承类以外使用。
VB中引用表达为
Private Declare Function OpenSetupDlg Lib "BH5104.dll" (hwnd As Any, Parameter As PARA) As Boolean
...
Private Sub SetupDlg_Click()
Dim Paramter As PARA
Dim Status As Boolean
Status=Opensetupdlg(Null,Parameter)
不知如何在delphi中引用这一DLL。我自己用的方法如下:
type PARA=record
...
end;
implementation
function OpenSetupDlg(hwnd:variant;Parameter:PPARA):Boolean;stdcall;external'bh5104.dll';
procedure TMainForm1.SBStartClick(Sender: TObject);
var
s:boolean;
Parameter:PPARA;
begin
...
s:=OpenSetupDlg(Null,Parameter);
...
end;

编译运行时提示:“access violation at address 10001536 in module "bh5104.dll".read of address FFFFFFFF”。
不知是何原因。请赐教。
 
hwnd:variant改为 hwnd:Pointer
s:=OpenSetupDlg(nil,Parameter);
(NULL 改为 nil)
 
PiPi:按照你的方法写,果然可以调出对话框,但问题是按对话框中的确定键后却总是提示Eaccessviolation exception in module xxx.exe. 这是什么原因呢?程序中尚未加入任何其它语句。
 
《说明书》中讲hwnd指向父窗口,那么这个值在delphi中应是怎样的呢? 是和VB一样,还是和VC一样(VC 中用this).先谢过了。
 
如果父窗口为form1则
hwnd指向form1.Handle
VC中this基本相当于delphi的self
 
经过思考,发现问题原来很简单,实际上将parameter:ppara 改成var Parameter:Para就行了; 当然, hwnd应象pipi说的用pointer,参数和VB一样。
不知道用var和用指针PPARA之间有什么差异。还请指点。
 
我说过:parameter:ppara 和 var Parameter:Para 编译以后是一样的,
只是delphi写起来不同,
你用 parameter:ppara 时候有个错误,没有分配内存
var
Parameter:PPARA;
mmmmm:PARA;
begin

Parameter:=@mmmmm;
//这样Parameter才能指向有效内存
OpenSetupDlg(Null,Parameter);
end
简单点就是:
var
mmmmm:PARA;
//这里没有 P 的
begin

OpenSetupDlg(Null,@mmmmm);
end
 
接受答案了.
 
后退
顶部