首页
社区
课程
招聘
[求助]花各位大牛几分钟时间,帮我看看VC中的dll如何用DELPHI调用
发表于: 2009-3-22 11:54 5091

[求助]花各位大牛几分钟时间,帮我看看VC中的dll如何用DELPHI调用

2009-3-22 11:54
5091
最近我下了个FAKEY的虚拟键盘模拟按键的代码,他里面生成了一个SENDKEY.dll,因为我不懂VC,我想用 DELPHI调用SENDKEY.DLL里面的4函数,(vksendkey,VKSendKeyEx,VKOpenVirtualKey,VKCloseVirtualKey)
sendkey.dll 里面的函数 声明如下:
extern "C" SENDKEY_API int VKSendKey(PVK_SENDKEY key)
{
        HANDLE file = CreateFile(DEVICE_NAME,GENERIC_WRITE|GENERIC_READ,0,0,OPEN_EXISTING,0,0);
        if(file == INVALID_HANDLE_VALUE)
        {
                return false;
        }

        DWORD BytesRet = 0;
        int ret = DeviceIoControl(file,IOCTL_SENDKEY,key,sizeof(VK_SENDKEY),0,0,&BytesRet,0);
        if(ret == 0)
        {
                return false;
        }

        CloseHandle(file);
        return true;
}

extern "C" SENDKEY_API HANDLE VKOpenVirtualKey()
{
        return CreateFile(DEVICE_NAME,GENERIC_WRITE|GENERIC_READ,0,0,OPEN_EXISTING,0,0);
}

extern "C" SENDKEY_API int VKCloseVirtualKey(HANDLE VKHandle)
{
        return CloseHandle(VKHandle);
}

extern "C" SENDKEY_API int VKSendKeyEx(HANDLE VKHandle,PVK_SENDKEY key)
{
        DWORD BytesRet = 0;
        return DeviceIoControl(VKHandle,IOCTL_SENDKEY,key,sizeof(VK_SENDKEY),0,0,&BytesRet,0);
}

//我在DELPHI里面的声明如下:
function VKSendKey(key:ptypedef):pointer;external 'SendKey.dll' name'VKSendKey';
//发送KEY
function VKSendKeyEX(phandle:cardinal;senkey:ptypedef):integer;stdcall;external 'SendKey.dll' name'VKSendKeyEx';
//发送key
function VKOpenVirtualKey:cardinal;stdcall;external 'SendKey.dll' name'VKOpenVirtualKey';
//打开HKEY
function VKCloseVirtualKey:cardinal;stdcall;external 'SendKey.dll' name'VKCloseVirtualKey';
//关闭HKEY

,其实上面都不是重点,关键是 VKSendKey(key:ptypedef) 那个指针KEY这个问题过不去
C里面的指针声明如下:

typedef struct
{
        int Count;
        struct
        {
                int Press;
                int Code;
        }Keys[6];
}VK_SENDKEY,*PVK_SENDKEY;

我用DELPHI定义指针如下:

typrec=record
press:integer;
code:integer;
end;

typedef=record
count:integer;
keys:array[0..5] of typrec;
end;

ptypedef=^typedef;
使用我的定义的结构
procedure TForm1.Button1Click(Sender: TObject);
var
e,e1: ptypedef;
begin

      E.count :=   1;
      E.keys[0].press   :=1;
      E.keys[0].code:=$24;
      getMeM(e,30);  //这里给指针申请内存空间
      vksendkey(@e);      //用VKSENDKEYEX也可以
      //vksendkeyex(hkey,@E);
end;



以下附上我的DELPHI源代码   
请各位大牛帮我看看要怎么弄

    unit sendkey;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Timer1: TTimer;
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

typrec=record
press:integer;
code:integer;
end;


typedef=record
count:integer;
keys:array[0..5] of typrec;
end;

ptypedef=^typedef;




var
  Form1: TForm1;
  hkey:cardinal;
//keys:array[1..6] of first;  //定义数组
data:ptypedef;

  implementation

{$R *.dfm}

//这里定义应用导入DLL的一些函数
function VKSendKey(key:ptypedef):pointer;external 'SendKey.dll' name'VKSendKey';
//发送KEY
function VKSendKeyEX(phandle:cardinal;senkey:ptypedef):integer;stdcall;external 'SendKey.dll' name'VKSendKeyEx';
//发送key
function VKOpenVirtualKey:cardinal;stdcall;external 'SendKey.dll' name'VKOpenVirtualKey';
//打开HKEY
function VKCloseVirtualKey:cardinal;stdcall;external 'SendKey.dll' name'VKCloseVirtualKey';
//关闭HKEY


procedure TForm1.Button1Click(Sender: TObject);
var
 e,e1: ptypedef;
begin

      E.count :=   1;
      E.keys[0].press   :=1;
      E.keys[0].code:=$24;
      getMeM(e,30);  //这里给指针申请内存空间
      vksendkeyex(hkey,@E);
//       e1:=e;                        //保留原来指针的位置
  //Dispose(E);

//FillChar(data,SizeOf(data),#0);
//FillMemory(@data,SizeOf(data),0);
//相当于VC++ MEMSET
edit2.SetFocus;       //先设置EDIT1为焦点,这样方便观察是否能输入
edit2.Text:='就绪';
vksendkeyex(hkey,@E);


//vksendkey(@E);
//vksendkey(E);

end;


procedure TForm1.FormCreate(Sender: TObject);
begin
   hkey:=VKOpenVirtualKey;
     edit1.Text:=inttostr(hkey);
end;

end.     

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
getMeM(e,30);  //这里给指针申请内存空间

++++++++++++++++++++++++

好像那个结构的大小是 4 + 8*6 = 52
2009-3-22 13:51
0
雪    币: 121
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
求你们了,别让帖子沉了,上面的getmem 原版的使用方法是
getmem(e,sizdeof(integer)*20) 这个方法我也改了,
还有楼上的我也使用了,依然是不行,冷静下来思考下,是不是不应该这么调用,还是vc的这个函数,DELPHI中不能这样声明,唉,,,, 书到用时方恨少啊, 期待天降大牛,把这个骨头给啃了,
2009-3-22 15:48
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
ptypedef:^typedef;

new(ptypede);

Dispose(ptypede);
2009-3-22 16:03
0
雪    币: 121
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
感谢楼上的,网游大侠,同时感谢JUSTLOVEMM,2位老师, 我成功啦,谢谢,!
结贴
再次感谢看雪,和各位大侠!
2009-3-22 17:35
0
游客
登录 | 注册 方可回帖
返回
//