■■ 高分求助 内存映射文件 不成功!■■
本帖最后由 mywmshow 于 2012-11-01 22:58:11 编辑 我用键盘钩子注入DLL,在网上拼凑的以下内存映射数据传送字符串,怎么还是不成功啊,求高人指点!
Var
TmpStr: PChar;
function installKeyProc(GameTid:THandle; DllId:THandle): THandle;
begin
KeyHhk := SetWindowsHookEx(WH_KEYBOARD, @Keyproc, DllId, GameTid);
Result := KeyHhk;
HookMutex := CreateMutex(nil, True, 'MUTEX_NAME');
MemFile := OpenFileMapping(FILE_MAP_WRITE, False, 'MEM_FILE');
if MemFile = 0 then MemFile := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, SizeOf(TmpStr), 'MEM_FILE');
TmpStr := MapViewOfFile(MemFile, File_MAP_WRITE, 0, 0, 0);
TmpStr:=PChar('要传的数据');
ReleaseMutex(HookMutex);
CloseHandle(HookMutex);
end;
function keyproc(icode, wp, lp: integer): DWORD; stdcall; //键盘HOOK回调函数
begin
if (wp = VK_HOME) then
begin
if MFrm = nil then
begin
MFrm := TMFrm.Create(nil);
MemFile := OpenFileMapping(FILE_MAP_WRITE, False, 'MEM_FILE');
TmpStr := MapViewOfFile(MemFile, File_MAP_WRITE, 0, 0, 0);
CloseHandle(MemFile);
MessageBox(0,TmpStr,'显示数据',MB_OK); //■■■■■■为什么还是显示不了数据呢■■■■■■
end;
MFrm.Visible:= not MFrm.Visible;
end;
keyProc := CallNextHookEx(KeyHhk, icode, wp, lp);
end;
var
hFileMap : THandle;
pShareMem : PAnsiChar;
Const
dwMemSize = 500 * 1024; //共享内存大小,刚好够就行
sMapFileName = 'FileMap_2.0_1';
procedure ShowSysError;
var
S : String;
begin
S := '错误原因:' + SysErrorMessage(GetLastError());
MessageBox(0 , Pointer(S) , '建立共享内存失败' , MB_OK or MB_ICONWARNING);
end;
procedure InitUnit;
begin
hFileMap := OpenFileMappingA(FILE_MAP_READ or FILE_MAP_WRITE , False , sMapFileName);
if hFileMap = 0 then
hFileMap := CreateFileMappingA($FFFFFFFF, NIL, PAGE_READWRITE, 0, dwMemSize , sMapFileName);
if hFileMap = 0 then begin
ShowSysError;
exit;
end;
pShareMem := MapViewOfFile(hFileMap , FILE_MAP_WRITE or FILE_MAP_READ , 0 , 0 , 0);
if pShareMem = nil then begin
ShowSysError;
CloseHandle(hFileMap);
hFileMap := 0;
exit;
end;
end;
procedure UnInitUnit;
begin
if pShareMem<>NIL then
UnMapViewOfFile(pShareMem);
if hFileMap<>0 then
CloseHandle(hFileMap);
end;
function installKeyProc(GameTid:THandle; DllId:THandle): THandle;
begin
if pShareMem=NIL then Result := 0
else begin
FillChar(pShareMem^ , dwMemSize , 0);
StrCopy(pShareMem , '要复制的数据');
//.......
KeyHhk := SetWindowsHookEx(WH_KEYBOARD, @Keyproc, DllId, GameTid);
Result := KeyHhk;
end;
end;
function keyproc(icode, wp, lp: integer): DWORD; stdcall; //键盘HOOK回调函数
begin
if xxxx xxx = VK_HOME then begin
//.......
if pShareMem<>NIL then
MessageBox(0 , pShareMem , '显示数据' , MB_OK);
end;
//.......
Result := CallNextHookEx(KeyHhk, icode, wp, lp);
end;
initialization
InitUnit;
finalization
UnInitUnit;
end.