type
TREG=function (Data:PChar):Boolean;stdcall;function Reg(Data:pchar):Boolean; external 'Project2.dll';procedure TForm1.Button1Click(Sender: TObject);
var
p:TREG;
h:thandle;
s:String;
begin
...]
s:='abcd';
h:=LoadLibrary('project2.dll');
p:=nil;
if h<>0 then
begin
@p:=GetProcAddress(h,'Reg');
p(PChar(s));
end;
// if Reg(PChar(s)) then Statusbar1.SimpleText:='Set success!';
end;==========DLL代码===========function Reg(Data:Pchar):Boolean;stdcall;
begin
MessageBox(0,Data,'testaaa',mb_ok);
end;exports
RegHook;
...很是奇怪,
首先,我是直接使用function RegHook(Data:pchar):Boolean; external 'Project2.dll';这种方式来引用DLL文件中的函数,在程序代码注释那部分中调用了DLL文件中的函数Reg,但弹出的提示框显示的内容是不认识的字符。
后来,我改成用GetProcAddress()函数取DLL文件函数的地址来调用函数Reg,弹出的提示框可以正常的显示abcd四个字符,这是什么原因呢?问题出在哪?还请大侠高手们指点,谢谢!
TREG=function (Data:PChar):Boolean;stdcall;function Reg(Data:pchar):Boolean; external 'Project2.dll';procedure TForm1.Button1Click(Sender: TObject);
var
p:TREG;
h:thandle;
s:String;
begin
...]
s:='abcd';
h:=LoadLibrary('project2.dll');
p:=nil;
if h<>0 then
begin
@p:=GetProcAddress(h,'Reg');
p(PChar(s));
end;
// if Reg(PChar(s)) then Statusbar1.SimpleText:='Set success!';
end;==========DLL代码===========function Reg(Data:Pchar):Boolean;stdcall;
begin
MessageBox(0,Data,'testaaa',mb_ok);
end;exports
RegHook;
...很是奇怪,
首先,我是直接使用function RegHook(Data:pchar):Boolean; external 'Project2.dll';这种方式来引用DLL文件中的函数,在程序代码注释那部分中调用了DLL文件中的函数Reg,但弹出的提示框显示的内容是不认识的字符。
后来,我改成用GetProcAddress()函数取DLL文件函数的地址来调用函数Reg,弹出的提示框可以正常的显示abcd四个字符,这是什么原因呢?问题出在哪?还请大侠高手们指点,谢谢!
type
PDataM=^DataM;
DataM=record
a:pchar;
b:HHOOK;
end;var
pdata:PDataM;
pHandle:THandle;procedure CreateMap;
begin
pHandle:=CreateFileMapping(Dword(-1),nil,PAGE_READWRITE,0,sizeOf(DataM),'TestMap');
pData:=MapViewOfFile(pHandle,FILE_MAP_ALL_ACCESS,0,0,0);
end;funtion setData(a:pchar):boolean;stdcall;
begin
pData.a:=a;
pData.b:=setWindowHookEx(...);
end;function CBTProc(...);
begin
messagebox(0,pData.a,'Test',mb_ok); //这个地方会报错!
...
end;procedure DLLEntryPoint(dwDeason:DWORD);
begin
case dwReason of
DLL_PROCESS_ATTACH:CreateMAP;
DLL_PROCESS_DETACH:ReleMAP;
end;exports
setData;begin
DLLProc=@DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end;===========主程序========== function setData(a:pchar):boolean;stdcall;implemenation
function setData;external 'Test.dll';procedure TForm1.Button1Click(sender:TObject);
begin
setData('abcd');
end;当钩子WH_CBT捕捉到消息后,执行到message()这一句会报错:
'0x77e197d8'指令引用的'0x00d54af4'内存,该内存不能为Read.
这个错误是怎么引起的呢?是不是内存映射没有建好?还请高手大侠们指点,谢谢!