Hallo.
Attach und Detach werden nun ausgeführt, nachdem ich DLLProc gesetzt habe.
Seitdem ich auf pView <> nil prüfe, stürzt Internet-Explorer nicht mehr ab.
Das Problem ist aber, dass pView = nil wird. Das ist jetzt natürlich ziemlich problematisch und auch das Schreiben in die Logdatei schlägt beim Aufruf von InternetExplorer mit dem RunTime Error 5 (File inaccessable) ab. Was kann ich tun?
Zusätzliche Frage: Wie ist es möglich, den
DLL-Teilprozess zu terminieren, wenn pView doch mal nil werden sollte?
Der
DLL-Code sieht nun so aus:
Delphi-Quellcode:
procedure Log(N:
string);
// debug
var
f: TextFile;
begin
AssignFile(f, '
c:\meinlog.txt');
Append(f);
WriteLn(f, N);
CloseFile(f);
end;
procedure DllMain(Reason: DWORD);
begin
case Reason
of
DLL_PROCESS_ATTACH:
begin
hMapping := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, MappingGUID);
pView := MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0);
Log('
Attach');
if pView <>
nil then
TargetHandle := PCardinal(pView)^;
// ToDo: Wenn nil, sollte DLL terminiert werden
if pView =
nil then
log('
Fehler 1');
end;
DLL_PROCESS_DETACH:
begin
Log('
Detach');
if pView <>
nil then
UnmapViewOfFile(pView);
if pView =
nil then
log('
Fehler 2');
CloseHandle(hMapping);
end;
end;
end;
begin
WM_ANYKEYPRESSED := RegisterWindowMessage('
WM_ANYKEYPRESSED');
WM_LMB_KEY_CONFIRM := RegisterWindowMessage('
WM_LMB_KEY_CONFIRM');
WM_RMB_KEY_CONFIRM := RegisterWindowMessage('
WM_RMB_KEY_CONFIRM');
DllProc := @DllMain;
DllProc(DLL_PROCESS_ATTACH);
end.
Nachtrag! Ignoriert man diesen Fehler, wird trotz des pView=nil das Tastaturereignis (WH_KEYBOARD_LL SendMessage) an die Host-Applikation (TargetHandle) weitergegeben. Das Maus-Ereignis (WH_MOUSE SendMessageTimeOut) wird aber nicht weitergegeben, die Maustaste kann also nicht durch die Host-Applikation gesperrt werden! Seltsamerweiße funktioniert das ähnliche Programm MTANWT einwandfrei mit Internet Explorer. Was ist das Geheimnis?
Gruß
blackdrake