急!求助!请高手帮忙解决我调用Dll文件中函数的问题,100分,谢谢! ( 积分: 100 )

  • 主题发起人 arron1104
  • 开始时间
A

arron1104

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在需要调用一个Dll文件中的一个函数,该Dll文件是用C++写的,在.h文件中有如下说明:BOOL InitialVideo(CWnd *hWnd);

我的delphi中,申明了该函数:
function InitialVideo(var pHandle: Longword):boolean;stdcall;external 'SONY285DLL.dll';

在.pas文件中做如下调用:
HHV = Longword;
HVSTATUS = Boolean;
procedure TForm1.Button1Click(Sender: TObject);
var
status:HVSTATUS;
begin


status := InitialVideo(m_hhv);

end;


但是运行时总是提示:projecct Test_Dll.exe raised exception class EAccessViolation with message "Access violation at address 00455c04 in module'Test_Dll.ext'.write of address 00000001".Process stopped.use step or Run to continue.

问题:是否我调用该Dll文件中的函数有误?该如何调用? 谢谢!
 
A

arron1104

Unregistered / Unconfirmed
GUEST, unregistred user!
哦,上面的.pas文件,忘记了m_hhv的定义。修改如下:
====================================
在.pas文件中做如下调用:
HHV = Longword;
HVSTATUS = Boolean;
m_hhv : HHV;

procedure TForm1.Button1Click(Sender: TObject);
var
status:HVSTATUS;
begin

status := InitialVideo(m_hhv);
end;

=====================================
 
A

arron1104

Unregistered / Unconfirmed
GUEST, unregistred user!
有没有大侠关注一下啊?小弟很急的。。。
 
C

cxz9

Unregistered / Unconfirmed
GUEST, unregistred user!
CWnd *hWnd要定义成指针类型的
看一下这个例子

void EncryQuota(char* pQuota,int len,char* key);
->
pQuotaKey = ^TQuotaKey;
TQuotaKey = array[0..8] of Char;

procedure EncryQuota(pQuota: pKKQUOTA_DATA;
len: Integer;
var key: pQuotaKey);
stdcall;
external 'initquota.dll' name 'EncryQuota2';
 
C

cjion

Unregistered / Unconfirmed
GUEST, unregistred user!
函数声明时参数要指针的( PLongWord = ^LongWord;在windows单元已经申明)
function InitialVideo(var pHandle: PLongWord) :boolean;stdcall;
external 'SONY285DLL.dll';

HHV = PLongword;
HVSTATUS = Boolean;
m_hhv : HHV;
 
A

arron1104

Unregistered / Unconfirmed
GUEST, unregistred user!
谢谢CXZ9 和 CJION。我的函数现在改为:
====================================
...
HHV = PLongword;
HVSTATUS = Boolean;
m_hhv : HHV;
...
function InitialVideo(var pHandle: PLongword):boolean;stdcall;external 'SONY285DLL.dll';
...
procedure TForm1.Button1Click(Sender: TObject);
var
status:HVSTATUS;
begin

status := InitialVideo(m_hhv);

if false = status then

begin

showmessage('Initial Camera failed);
end;

end;

=====================================
不过还是出现以前的错误提示。是不是我现在不能用PLongword代替C++中的*hWnd参数??
 

小雨哥

Unregistered / Unconfirmed
GUEST, unregistred user!
原因:
“SONY285DLL.dll” 中定义的 BOOL InitialVideo(CWnd *hWnd) 不能在 Delphi 中直接调用。

解决:
1.如果不能修改 “SONY285DLL.dll”源代码,则需要使用 C++ 重新包装一个DLL导出。
2.可以修改“SONY285DLL.dll”则增加修饰词 WINAPI 在 DEF 文件中导出。
 
A

arron1104

Unregistered / Unconfirmed
GUEST, unregistred user!
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
顶部