CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

DLL的调用

楼主alin()2000-07-24 12:55:00 在 Delphi / VCL组件开发及应用 提问

我有个DLL文件,有源代码,C++语言,但我想用DELPHI来调用如下:  
  Const  
      MWM_UpdateMsg   =WM_USER+$100;  
      MWM_CopyMsg       =WM_USER+$101;  
      MWM_MouseMsg     =WM_USER+$102;  
   
  function   SetHook(hWnd:HWND;UpdateMsg,CopyMsg,MouseMsg:Integer):Boolean;stdcall;external   'VNCHooks.dll';  
  function   UnSetHook(hWnd:HWND):Boolean;stdcall;external   'VNCHooks.dll';  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  begin  
    if   SetHook(Handle,MWM_UpdateMsg,MWM_CopyMsg,MWM_MouseMsg)   then  
          ShowMessage('OK');  
  end;  
   
  procedure   TForm1.Button2Click(Sender:   TObject);  
  begin  
      UnSetHook(Handle);  
  end;  
  但有问题,不知怎回事,谁能帮我写一个DELPHI调用它的例子  
   
  DLL源代码位置:  
  http://alin.heha.net/vnchooks.zip  
  问题点数:100、回复次数:11Top

1 楼zsr(老牛)回复于 2000-07-24 13:03:00 得分 0

能把问题说的详细点吗??Top

2 楼alin()回复于 2000-07-24 13:18:00 得分 0

就是我现在有一个DLL及源代码,想用DELPHI来调用,但我写的内容在执行后有问题,出错为可能是越界操作,但我不太明白,大家可下载DLL源代码及我写的调用方式先试一下,看看有什么问题Top

3 楼JGTM2000(铁马小子)回复于 2000-07-26 00:40:00 得分 0

把你的DLL中函数的C++声明抄来,最好相关的实现部分也抄来。Top

4 楼Gempin(宝石别针)回复于 2000-07-26 00:53:00 得分 0

如果SetHook()返回的不是布尔值或整型值,就有可能出错!测试一下此函数的实际返回值。  
  Top

5 楼alin()回复于 2000-07-26 08:56:00 得分 0

DLL源代码位置:  
  http://alin.heha.net/vnchooks.zip  
   
  DLL的声明  
  #if   !defined(_VNCHOOKS_DLL_)  
  #define   _VNCHOOKS_DLL_  
   
  #include   <windows.h>  
   
  /////////////////////////////////////////////////////////////////////////////  
  //   Define   the   import/export   tags  
   
  #define   DllImport   __declspec(dllimport)  
  #define   DllExport   __declspec(dllexport)  
   
  /////////////////////////////////////////////////////////////////////////////  
  //  
  //   Functions   used   by   WinVNC  
   
  extern   "C"  
  {  
  //   DLL   functions:  
  DllExport   BOOL   SetHook(  
  HWND   hWnd,  
  UINT   UpdateMsg,  
  UINT   CopyMsg,  
  UINT   MouseMsg  
  ); //   Set   the   hook  
  DllExport   BOOL   UnSetHook(HWND   hWnd); //   Remove   it  
   
  DllExport   BOOL   SetKeyboardFilterHook(BOOL   activate);  
  //   Control   keyboard   filtering  
  DllExport   BOOL   SetMouseFilterHook(BOOL   activate);  
  //   Control   mouse   filtering  
  }  
   
  #endif   //   !defined(_VNCHOOKS_DLL_)  
  Top

6 楼halfdream(哈欠)回复于 2000-07-26 16:18:00 得分 0

function   UnSetHook(hWnd:HWND):Boolean;stdcall;external   'VNCHooks.dll';  
                                                                              ~~~~~~~\可能这儿错了。  
  Top

7 楼zengyufeng(御风)回复于 2000-07-26 18:16:00 得分 0

你应该这样声名输出函数  
  DllExport   BOOL   __stdcall   UnSetHook(HWND   hWnd);    
                                ~~~~~~~~~Top

8 楼alin()回复于 2000-07-26 19:24:00 得分 0

halfdream:stdcall为按C方式参数传递,去掉后一样出错  
  zengyfeng:照你的方法,DELPHI指出找不到相应的输出函数,DELPHI中应怎样省明  
  另:  
      按我原来的方式,  
  if   SetHook(Handle,MWM_UpdateMsg,MWM_CopyMsg,MWM_MouseMsg)   then  
          ShowMessage('OK');  
  其实OK已经正常显示,应该说HOOK安装正确,出错报  
  Access   Vialation   at   address   000000500   .read   at   address   FFFFFFF  
  是在StdCtrls单元下面的内容里  
  procedure   TButtonControl.WndProc(var   Message:   TMessage);  
  begin  
      case   Message.Msg   of  
          WM_LBUTTONDOWN,   WM_LBUTTONDBLCLK:  
              if   not   (csDesigning   in   ComponentState)   and   not   Focused   then  
              begin  
                  FClicksDisabled   :=   True;  
                  Windows.SetFocus(Handle);  
                  FClicksDisabled   :=   False;  
                  if   not   Focused   then   Exit;  
              end;  
          CN_COMMAND:  
              if   FClicksDisabled   then   Exit;  
      end;  
      inherited   WndProc(Message);  
  end;     //在这里报错  
  不知什么原因,请高手指点  
   
  Top

9 楼JGTM2000(铁马小子)回复于 2000-07-27 01:49:00 得分 100

用cdecl代替stdcall,因为在你的C函数定义中没有定为stdcall。  
   
  为什么能正确调用:因为cdecl和stdcall的参数压栈方式相同。  
  为什么错误出现在调用后:因为cdecl有调用者清栈,stdcall有被调者清栈,因此你用stdcall方式去调用cdecl的函数将导致堆栈多弹出了有用数据,导致访问违例。Top

10 楼alin()回复于 2000-07-27 08:54:00 得分 0

JGTM2000,谢谢你,已给分了Top

11 楼JGTM2000(铁马小子)回复于 2000-07-27 18:07:00 得分 0

我怎么没看见分?哈哈。。。Top

相关问题

  • dll的调用?
  • DLL调用
  • 调用DLL
  • 调用DLL
  • DLL调用
  • How 调用DLL ?
  • dll调用!
  • 调用dll
  • 调用DLL
  • dll调用

关键词

  • .net
  • 函数
  • 源代码
  • dll
  • delphi
  • mwm
  • vnchooks
  • 调用
  • copymsg
  • mousemsg

得分解答快速导航

  • 帖主:alin
  • JGTM2000

相关链接

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

广告也精彩

反馈

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