DLL求助

hongss 2003-07-04 08:39:44
现在要做一个动态连接库,实现以下功能:
在DLL中,用procedure加入一段汇编语言,进行A/D转换。这段汇编中,包含一个变量gate,进行通道选择,然后进行A/D采集。输出采集到的数据Caiji。
我这样做好以后,在主程序中进行调用procedure Caiji:Integer;stdcall;external 'ADC.dll' name 'Caiji';

编译一切正常,但是在运行时,会出现错误提示。关闭这个程序后,就不能再运行。系统提示内存不足,让退出一些应用程序然后运行。可是我现在没有运行别的程序呀?!

请问是怎么回事?

哪位大虾能给出一些DLL调用的例子,最好包括调用procedure和调用Function的,谢谢!
...全文
86 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
hongss 2003-07-09
  • 打赏
  • 举报
回复
无人问津了吗?
hongss 2003-07-07
  • 打赏
  • 举报
回复
先谢谢你!

我这里的gate值,是要不停变化的。就是说,我要轮换着采集0,1,2……这些通道的数据,
这样的话,你的这一段程序能用吗?
还有,我原来程序里的Result要放在后边的程序里进行调用的。

就是说,我的这段程序,每一次调用时,需要有一个gate值输入,输出一个采集到的值Result。

再一次谢谢你!
ypyRock 2003-07-07
  • 打赏
  • 举报
回复
你肯定是内存泄漏了,没有及时释放
Eastunfail 2003-07-05
  • 打赏
  • 举报
回复
procedure本身就没有返回值得。我不清楚你的意思,我以为你要让procedure有返回值,所以我就将结果保存到寄存器eax中了。

可是这样:已经定义了gate,你可以选择gate的值。
procedure Caiji(gate: Byte);stdcall;
var
adh,adl: Byte;
begin
asm
push ax
push dx
mov dx,210h
mov al,0
out dx,al
@@lab:mov dx,211h
mov al,0
out dx,al
mov dx,211h
mov al,0
out dx,al
mov dx,210h
in al,dx
and al,01h
jnz @@lab
mov dx,213h
in al,dx
mov adh,al
mov dx,212h
in al,dx
mov adl,al
pop dx
pop ax
mov eax,adh
shl eax,8
add eax,adl
end;
end;
hongss 2003-07-05
  • 打赏
  • 举报
回复
你这样不行!
我要的是能够选择通道号的,你这里固定通道为0,不行。
另外,我要求这个procedure要输出一个结果变量,以供我后面的程序调用。


我的procedure:

procedure Caiji: Integer;stdcall;
var
adh,adl: Byte;
begin
asm
push ax
push dx
mov dx,210h
mov al,gate //这里的gate是通道号,后面的程序在调用这个dll的时候,
//先给gate赋值,进行通道选择。
out dx,al
@@lab:mov dx,211h
mov al,0
out dx,al
mov dx,211h
mov al,0
out dx,al
mov dx,210h
in al,dx
and al,01h
jnz @@lab
mov dx,213h
in al,dx
mov adh,al
mov dx,212h
in al,dx
mov adl,al
pop dx
pop ax
end;
Result:=adh*256+adl;
end;

exports
Result;

begin
end.

进行调用的时候,执行:
gate:=0; //或者gate:=1;
caiji;

我是这样写的。
李_军 2003-07-04
  • 打赏
  • 举报
回复
楼上的给你提供的是动态加载dll的例子,不过我认为肯定是你的dll中写的过程有问题
yoisyois 2003-07-04
  • 打赏
  • 举报
回复

type
TfrmLoginShowModal = procedure(AHandle: THandle); stdcall;
TGetUseInfo = function(AHandle: THandle): pUserInfo; stdcall;
TGetQuitFlag = function(AHandle: THandle): Boolean; stdcall;

var
LHM: THandle;
frmLoginShowModal: TfrmLoginShowModal;
GetUseInfo: TGetUseInfo;
GetQuitFlag: TGetQuitFlag;
UserWantQuit: Boolean;

{$R *.res}

begin
Application.Initialize;
UserWantQuit := false;
if FileExists('DLL_UserLogin.dll') then begin
LHM := LoadLibrary(PChar('DLL_UserLogin.dll'));
AHandle := LHM;
try
@frmLoginShowModal := GetProcAddress(LHM, 'frmLoginShowModal');
@GetUseInfo := GetProcAddress(LHM, 'GetUserInfo');
@GetQuitFlag := GetProcAddress(LHM, 'GetQuitFlag');
if (@frmLoginShowModal <> nil)
and (@GetUseInfo <> nil)
and (@GetQuitFlag <> nil) then
begin
CoInitialize(nil);
frmLoginShowModal(Application.Handle);
UserInfo := GetUseInfo(Application.Handle); //test
showmessage(userInfo.ID);
UserWantQuit := GetQuitFlag(Application.Handle);
CoUninitialize;
end;

if UserWantQuit = false then begin
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm3, Form3);
Application.Run;
end;
finally
FreeLibrary(LHM);
end;
end
else begin
myMessageBox('动态链接库文件DLL_UserLogin.dll不存在,请检查。',
mbOk, mtWarning);
UserWantQuit := true;
end;

end.

Eastunfail 2003-07-04
  • 打赏
  • 举报
回复
加了三条

mov eax,adh //Result:=adh
shl eax,8 // Result:=Result * 256
add eax,adl //Inc(Result,adl);
Eastunfail 2003-07-04
  • 打赏
  • 举报
回复
看看我改后的:

procedure Caiji(gate: Byte);stdcall;
var
adh,adl: Byte;
begin
asm
push ax
push dx
mov dx,210h
mov al,0
out dx,al
@@lab:mov dx,211h
mov al,0
out dx,al
mov dx,211h
mov al,0
out dx,al
mov dx,210h
in al,dx
and al,01h
jnz @@lab
mov dx,213h
in al,dx
mov adh,al
mov dx,212h
in al,dx
mov adl,al
pop dx
pop ax
mov eax,adh
shl eax,8
add eax,adl
end;
end;
李_军 2003-07-04
  • 打赏
  • 举报
回复
那你的procedure 是怎么写的
hongss 2003-07-04
  • 打赏
  • 举报
回复
我的DLL文件中的一个数据采集过程,带一个通道选择的过程,我用Function出来就没问题,而我把它变成procedure就会出现我上边说得问题。
请各位大侠看看我的这段程序:
【这是DLL的Function程序】
Function Caiji(gate: Byte): Integer;stdcall;
var
adh,adl: Byte;
begin
asm
push ax
push dx
mov dx,210h
mov al,0
out dx,al
@@lab:mov dx,211h
mov al,0
out dx,al
mov dx,211h
mov al,0
out dx,al
mov dx,210h
in al,dx
and al,01h
jnz @@lab
mov dx,213h
in al,dx
mov adh,al
mov dx,212h
in al,dx
mov adl,al
pop dx
pop ax
end;
Result:=adh*256+adl;
end;

exports
Caiji;

begin
end.
而这段程序,我用procedure出来就不行?!
难道是我用procedure写出来的时候写错了?
应该怎么写?怎么调用?谢谢!

唉~~~~我已经晕了。
Behard 2003-07-04
  • 打赏
  • 举报
回复
楼主的表达有问题 ^_^
我的看法:
1. 由 Exe 申请内存,传递到 Dll 中,采集结束返回成功或者使用 PostMessage

2. 如果是由 Dll 中申请内存使用返回的话,请使用 static 定义,把地址传递到 Exe

3. 我没有使用过 Delphi 的,我是以 BCBer 的习惯说的,如果你觉得不对,请不要使用
Behard 2003-07-04
  • 打赏
  • 举报
回复
楼主的表达有问题 ^_^
我的看法:
1. 由 Exe 申请内存,传递到 Dll 中,采集结束返回成功或者使用 PostMessage

2. 如果是由 Dll 中申请内存使用返回的话,请使用 static 定义,把地址传递到 Exe

3. 我没有使用过 Delphi 的,我是以 BCBer 的习惯说的,如果你觉得不对,请不要使用

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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