CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
英特尔®游戏设计大赛100美元现金周周送 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  Windows SDK/API

DLL求助

楼主hongss(笑霸王)2003-07-04 08:39:44 在 Delphi / Windows SDK/API 提问

现在要做一个动态连接库,实现以下功能:  
  在DLL中,用procedure加入一段汇编语言,进行A/D转换。这段汇编中,包含一个变量gate,进行通道选择,然后进行A/D采集。输出采集到的数据Caiji。  
  我这样做好以后,在主程序中进行调用procedure   Caiji:Integer;stdcall;external   'ADC.dll'   name   'Caiji';  
   
  编译一切正常,但是在运行时,会出现错误提示。关闭这个程序后,就不能再运行。系统提示内存不足,让退出一些应用程序然后运行。可是我现在没有运行别的程序呀?!  
   
  请问是怎么回事?  
   
  哪位大虾能给出一些DLL调用的例子,最好包括调用procedure和调用Function的,谢谢!  
  问题点数:50、回复次数:12Top

1 楼yoic(我是一棵菠菜,菜,菜,菜,菜,菜,菜)回复于 2003-07-04 08:45:54 得分 10

 
  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.  
   
  Top

2 楼ljmanage(过客)回复于 2003-07-04 12:39:42 得分 5

楼上的给你提供的是动态加载dll的例子,不过我认为肯定是你的dll中写的过程有问题Top

3 楼Behard(我爱天安门)回复于 2003-07-04 13:19:31 得分 5

楼主的表达有问题   ^_^  
  我的看法:  
  1.   由   Exe   申请内存,传递到   Dll   中,采集结束返回成功或者使用   PostMessage  
   
  2.   如果是由   Dll   中申请内存使用返回的话,请使用   static   定义,把地址传递到   Exe  
   
  3.   我没有使用过   Delphi   的,我是以   BCBer   的习惯说的,如果你觉得不对,请不要使用Top

4 楼Behard(我爱天安门)回复于 2003-07-04 13:20:27 得分 0

楼主的表达有问题   ^_^  
  我的看法:  
  1.   由   Exe   申请内存,传递到   Dll   中,采集结束返回成功或者使用   PostMessage  
   
  2.   如果是由   Dll   中申请内存使用返回的话,请使用   static   定义,把地址传递到   Exe  
   
  3.   我没有使用过   Delphi   的,我是以   BCBer   的习惯说的,如果你觉得不对,请不要使用Top

5 楼hongss(笑霸王)回复于 2003-07-04 17:46:18 得分 0

我的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写出来的时候写错了?  
  应该怎么写?怎么调用?谢谢!  
   
  唉~~~~我已经晕了。  
  Top

6 楼ljmanage(过客)回复于 2003-07-04 18:29:49 得分 0

那你的procedure   是怎么写的Top

7 楼Eastunfail(龍子龍孫) (Serpent's Embrace)回复于 2003-07-04 19:31:25 得分 30

看看我改后的:  
   
  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;Top

8 楼Eastunfail(龍子龍孫) (Serpent's Embrace)回复于 2003-07-04 19:33:20 得分 0

加了三条  
   
              mov   eax,adh   //Result:=adh  
              shl   eax,8       //   Result:=Result   *   256  
              add   eax,adl     //Inc(Result,adl);Top

9 楼hongss(笑霸王)回复于 2003-07-05 14:25:27 得分 0

你这样不行!  
  我要的是能够选择通道号的,你这里固定通道为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;  
   
  我是这样写的。  
  Top

10 楼Eastunfail(龍子龍孫) (Serpent's Embrace)回复于 2003-07-05 19:22:41 得分 0

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;  
  Top

11 楼hongss(笑霸王)回复于 2003-07-07 09:53:05 得分 0

先谢谢你!  
   
  我这里的gate值,是要不停变化的。就是说,我要轮换着采集0,1,2……这些通道的数据,  
  这样的话,你的这一段程序能用吗?  
  还有,我原来程序里的Result要放在后边的程序里进行调用的。  
   
  就是说,我的这段程序,每一次调用时,需要有一个gate值输入,输出一个采集到的值Result。  
   
  再一次谢谢你!  
  Top

12 楼ypyRock(Rock)回复于 2003-07-07 15:41:29 得分 0

你肯定是内存泄漏了,没有及时释放Top

13 楼hongss(笑霸王)回复于 2003-07-09 09:18:52 得分 0

无人问津了吗?  
  Top

相关问题

  • DLL
  • DLL?
  • dll
  • DLL
  • *.dll
  • dll?
  • (.dll)
  • dll is 》》》----------------------------------------->
  • DLL
  • dll

关键词

  • dll
  • 内存
  • dx
  • adl
  • al
  • adh
  • caiji
  • lhm
  • 调用
  • mov

得分解答快速导航

  • 帖主:hongss
  • yoic
  • ljmanage
  • Behard
  • Eastunfail

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo