是这样的,母程序把DLL加载到了explore.exe中后,自己就死掉了,现在想用全局热键调出DLL中的窗体,但是写不出来了,以下是母程序把DLL加载到了explore.exe源程序
unit toDllUnt;
   
interface   
   
uses   
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,   
  StdCtrls, tlhelp32, ExtCtrls;
{type  
  TProcessEntry32 = record  
    dwSize: DWORD;  
    cntUsage: DWORD;  
    th32ProcessID: DWORD;  
    th32DefaultHeapID: DWORD;  
    th32ModuleID: DWORD;  
    cntThreads: DWORD;  
    th32ParentProcessID: DWORD;  
    pcPriClassBase: integer;  
    dwFlags: DWORD;  
    szExeFile: array[0..MAX_PATH - 1] of char;  
  end; }   
type
  TtoDllFrm = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
{ Public declarations }
  end;   
   
var   
  toDllFrm: TtoDllFrm;   
implementation   
   
{$R *.DFM}
function EnableHideHook: BOOL; external 'HKPHide.DLL';
function DisableHideHook: BOOL; external 'HKPHide.DLL';{ function GetDllChildForm:Tform; stdcall;external 'dll.dll';
  procedure InitDLL(App:TApplication);stdcall;external 'dll.dll';
  procedure FreeDLL;stdcall;external 'dll.dll';      }
  
procedure FindAProcess(const AFilename: string; const PathMatch: Boolean; var ProcessID: DWORD);   
var   
  lppe: TProcessEntry32;   
  SsHandle: Thandle;
  FoundAProc, FoundOK: boolean;   
begin   
  ProcessID :=0;   
  SsHandle := CreateToolHelp32SnapShot(TH32CS_SnapProcess, 0);   
  FoundAProc := Process32First(Sshandle, lppe);   
  while FoundAProc do
  begin   
    if PathMatch then   
      FoundOK := AnsiStricomp(lppe.szExefile, PChar(AFilename)) = 0   
    else   
      FoundOK := AnsiStricomp(PChar(ExtractFilename(lppe.szExefile)), PChar(ExtractFilename(AFilename))) = 0;   
    if FoundOK then   
    begin   
      ProcessID := lppe.th32ProcessID;   
      break;   
    end;   
    FoundAProc := Process32Next(SsHandle, lppe);   
  end;   
  CloseHandle(SsHandle);   
end;   
   
function EnabledDebugPrivilege(const bEnabled: Boolean): Boolean;   
var   
  hToken: THandle;   
  tp: TOKEN_PRIVILEGES;   
  a: DWORD;   
const   
  SE_DEBUG_NAME = 'SeDebugPrivilege';   
begin   
  Result := False;   
  if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken)) then   
  begin   
    tp.PrivilegeCount := 1;   
    LookupPrivilegeValue(nil, SE_DEBUG_NAME, tp.Privileges[0].Luid);   
    if bEnabled then   
      tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED   
    else   
      tp.Privileges[0].Attributes := 0;   
    a := 0;   
    AdjustTokenPrivileges(hToken, False, tp, SizeOf(tp), nil, a);   
    Result := GetLastError = ERROR_SUCCESS;   
    CloseHandle(hToken);   
  end;   
end;   
   
function AttachToProcess(const HostFile, GuestFile: string; const PID: DWORD = 0): DWORD;   
var   
  hRemoteProcess: THandle;   
  dwRemoteProcessId: DWORD;   
  cb: DWORD;   
  pszLibFileRemote: Pointer;   
  iReturnCode: Boolean;   
  TempVar: DWORD;   
  pfnStartAddr: TFNThreadStartRoutine;   
  pszLibAFilename: PwideChar;   
begin   
  Result := 0;
  EnabledDebugPrivilege(True);
  Getmem(pszLibAFilename, Length(GuestFile) * 2 + 1);   
  StringToWideChar(GuestFile, pszLibAFilename, Length(GuestFile) * 2 + 1);   
  if PID > 0 then   
     dwRemoteProcessID := PID   
  else   
     FindAProcess(HostFile, False, dwRemoteProcessID);   
  hRemoteProcess := OpenProcess(PROCESS_CREATE_THREAD + {允许远程创建线程}   
      PROCESS_VM_OPERATION + {允许远程VM操作}   
      PROCESS_VM_WRITE, {允许远程VM写}   
      FALSE, dwRemoteProcessId);   
  cb := (1 + lstrlenW(pszLibAFilename)) * sizeof(WCHAR);   
  pszLibFileRemote := PWIDESTRING(VirtualAllocEx(hRemoteProcess, nil, cb, MEM_COMMIT, PAGE_READWRITE));   
  TempVar := 0;   
  iReturnCode := WriteProcessMemory(hRemoteProcess, pszLibFileRemote, pszLibAFilename, cb, TempVar);   
  if iReturnCode then   
  begin
    pfnStartAddr := GetProcAddress(GetModuleHandle('Kernel32'), 'LoadLibraryW');
    TempVar := 0;
    Result := CreateRemoteThread(hRemoteProcess, nil, 0, pfnStartAddr, pszLibFileRemote, 0, TempVar);
  end;
  Freemem(pszLibAFilename);
end;procedure TtoDllFrm.Button1Click(Sender: TObject);
begin
TRY
  AttachToProcess('Explorer.exe', extractfilepath(paramstr(0))+'sysinfo.dll');
//其中'sysinfo.dll'是想要注入到Explorer.EXE的进程,Explorer.exe也可以是别的进程.
  FInally
   //if EnableHideHook then
  CLOSE;
   end;
end;
'sysinfo.dll'不知道怎么写,才能在母程序关闭后,相应用户热键?调出DLL中的窗体供用户操作。