BOOL GetDllName(HANDLE hProcess, LPLOAD_DLL_DEBUG_INFO lddi, LPSTR dll_name, int nSize) 

    LPVOID ptr = 0; 
    ReadProcessMemory(hProcess, lddi->lpImageName, &ptr, sizeof(ptr), NULL); 
    if( ptr == 0 ) return FALSE;     WCHAR dll_name_u[MAX_PATH + 1] = {0}; 
    ReadProcessMemory(hProcess, ptr, dll_name_u, sizeof(dll_name_u), NULL); 
    if( dll_name_u[0] == 0 ) return FALSE;     if( lddi->fUnicode ) 
        wcstombs(dll_name, dll_name_u, nSize); 
    else 
        lstrcpyn(dll_name, (LPSTR)dll_name_u, nSize); 
    return TRUE; 
}  这段代码我自己转成这样,不知道接下来怎么转了,一上午了请各位帮帮忙啊,谢谢function GetDllName(hProcess:THandle;lddi:TLoadDLLDebugInfo ;dll_name:string; nSize:Integer):boolean;
var
dll_name_u:array[0..255] of WideChar; 
ptr:integer;
xsize:DWORD;
begin
    ReadProcessMemory(hProcess, lddi.lpImageName, @ptr, 4, xsize);
    ReadProcessMemory(hProcess, Pointer(ptr), @dll_name_u, 255, xsize);

解决方案 »

  1.   

    不能帮你写了,提醒一句
    LPVOID 对应 Pointer
      

  2.   

    //BOOL GetDllName(HANDLE hProcess, LPLOAD_DLL_DEBUG_INFO lddi, LPSTR dll_name, int nSize) 
    function GetDLLName(hProcess: THandle; lddi: LPLOAD_DLL_DEBUG_INFO; var dll_name: AnsiString)
    //{ 
    //    LPVOID ptr = 0; 
    var
      ptr: Pointer;
      nBytes: DWORD;
      dll_name_u: array[0..MAX_PATH] of WideChar;
    begin
      Result := false;
      ptr := Nil;
        //ReadProcessMemory(hProcess, lddi->lpImageName, &ptr, sizeof(ptr), NULL); 
      ReadProcessMemory(hProcess, lddi^.lpImageName, @ptr, sizeof(ptr), nBytes);
      //  if( ptr == 0 ) return FALSE; 
      if ptr = Nil then exit;  //  WCHAR dll_name_u[MAX_PATH + 1] = {0}; 
      fillchar(dll_name_u, MAX_PATH * sizeof(dll_name_u[0]), 0);
      //  ReadProcessMemory(hProcess, ptr, dll_name_u, sizeof(dll_name_u), NULL); 
      ReadProcessMemory(hProcess, ptr, @dll_name_u[0], sizeof(dll_name_u), nBytes);
      //  if( dll_name_u[0] == 0 ) return FALSE; 
      if Word(dll_name_u[0])= 0 then Exit;  //  if( lddi->fUnicode ) 
      if lddi^.fUnicode <> 0 then
            //wcstombs(dll_name, dll_name_u, nSize); 
        dll_name := WideString(dll_name_u)
      //  else 
      else
      //      lstrcpyn(dll_name, (LPSTR)dll_name_u, nSize); 
        SetString(dll_name, PAnsiChar(@dll_name_u[0]), strlen(PAnsiChar(@dll_name_u[0])));
      //  return TRUE; 
      Result := true;
    //}  
    end;
      

  3.   

    谢谢,能否再问下,怎么一直获取不了啊?dll_name:ANSISTRING;LOAD_DLL_DEBUG_EVENT :
               begin
               GetDllName(ProcHand,@DBEvent.LoadDll,dll_name);
               messagebox(0,pchar(dll_name),0,0);
    用以下的代码,
    function GetDLLName(hProcess: THandle; lddi: PLoadDLLDebugInfo; var dll_name: AnsiString):boolean ;
    var
      ptr: Pointer;
      nBytes: DWORD;
      dll_name_u: array[0..MAX_PATH] of WideChar;
    begin
      Result := false;
      ptr := Nil;
      ReadProcessMemory(hProcess, lddi^.lpImageName, @ptr, sizeof(ptr), nBytes);
      if ptr = Nil then messagebox(0,'error1',0,0); //直接 这就弹出了,是怎么回事啊?  //  WCHAR dll_name_u[MAX_PATH + 1] = {0};
      fillchar(dll_name_u, MAX_PATH * sizeof(dll_name_u[0]), 0);
      //  ReadProcessMemory(hProcess, ptr, dll_name_u, sizeof(dll_name_u), NULL);
      ReadProcessMemory(hProcess, ptr, @dll_name_u[0], sizeof(dll_name_u), nBytes);
      //  if( dll_name_u[0] == 0 ) return FALSE;
      if Word(dll_name_u[0])= 0 then messagebox(0,'error2',0,0);  //  if( lddi->fUnicode )
      if lddi^.fUnicode <> 0 then
            //wcstombs(dll_name, dll_name_u, nSize);
        dll_name := WideString(dll_name_u)
      //  else
      else
      //      lstrcpyn(dll_name, (LPSTR)dll_name_u, nSize);
        SetString(dll_name, PAnsiChar(@dll_name_u[0]), strlen(PAnsiChar(@dll_name_u[0])));
      //  return TRUE;
      Result := true;
    //}
    end;