捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  沪ICP备05001939号 DELPHI盒子 | 盒子论坛 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 论坛检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
 
广告
评论:【MemLibrary.pas】从内存中加载DLL DELPHI版(无下载)
profhuang 42627 2012/8/16 9:43:55
delphi7 + win7,memFreeLibrary中VirtualFree始终返回false.
cgzcgb 41905 2011/10/16 19:14:56
Win7+DelphiXE
一直无法调试成功。。。
linghe 41883 2011/9/30 17:37:27
樓主厲害!
kingermaster 41860 2011/9/17 19:23:36
WIN7 D2010 LITE 测试
result := GetProcAddressX(dwNewModule,PChar(Copy(ExportName,dwPosDot+1,Length(ExportName)))); 出错
改成
result := GetProcAddress(dwNewModule,PChar(Copy(ExportName,dwPosDot+1,Length(ExportName))));
cgzcgb 41394 2011/3/22 22:27:16
Win7+D7 正常,delphi Ex不行,高手们整整?
hon3389 41390 2011/3/21 14:31:10
不错,不错!
Pointer(dwHandle) 改成 @dwHandle
hiphop 41382 2011/3/16 17:15:32
本人初学者,测试例子代码也出现了问题
后来百度了一下VirtualFree函数
貌似第一个参数是个地址(不是指针)
所以 把MemLibrary.pas的
if VirtualFree(Pointer(dwHandle),INH^.OptionalHeader.SizeOfImage,MEM_DECOMMIT) then
改成
if VirtualFree(@dwHandle,INH^.OptionalHeader.SizeOfImage,MEM_DECOMMIT) then
即可
就是说Pointer(dwHandle) 改成 @dwHandle

希望可以帮助后来的同学 !~```
bgf0411 41364 2011/3/10 13:30:00
挺好用的 win7没测试 XP没问题
netkiller 41244 2010/12/17 21:19:24
win7家庭版无效
lovehuaibb 41216 2010/11/27 19:13:25
Win7 可用
Xp Sp3 + Delphi7
Win7旗舰7600 + Delphi7
测试无压力
mimakongjing 41126 2010/10/22 17:04:05
win7应该是不能用的
hon3389 41083 2010/10/15 2:03:51
 memFreeLibrary(h); 变这样就没事了 FreeLibrary(h);
melice 41008 2010/9/25 21:51:34
一个简单的例子:

type
  mbf = function(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer;
  stdcall;

procedure TForm1.Button1Click(Sender: TObject);
var
  h: integer;
  mb: pointer;
  ms: TMemoryStream;
begin
  ms := TMemoryStream.Create;
  ms.LoadFromFile('f:\user32.dll');
  h := memLoadLibrary(ms.Memory);

  if h > 0 then
  begin
    mb := memGetProcAddress(h, 'MessageBoxA');
    if mb <> nil then
      mbf(mb)(handle, 'test', 'test', mb_ok);
  end;

  memFreeLibrary(h);
  ms.Free;
end;

但是运行之后会出异常.
melice 41007 2010/9/25 21:23:04
先试试看。
jacktl 41006 2010/9/25 20:18:35
有没有demo
stephenmax 41002 2010/9/25 11:50:31
win7下能用不?
baby999 41001 2010/9/25 9:25:07
少个GetProcAddressX函数

function GetProcAddressX(dwLibraryHandle: DWord; pFunctionName: PChar): Pointer; stdcall;
var
  NtHeader          : PImageNtHeaders;
  DosHeader          : PImageDosHeader;
  DataDirectory      : PImageDataDirectory;
  ExportDirectory    : PImageExportDirectory;
  i          : Integer;
  iExportOrdinal     : Integer;
  ExportName         : String;
  dwPosDot          : DWord;
  dwNewmodule        : DWord;
  pFirstExportName   : Pointer;
  pFirstExportAddress: Pointer;
  pFirstExportOrdinal: Pointer;
  pExportAddr        : PDWord;
  pExportNameNow     : PDWord;
  pExportOrdinalNow  : PWord;
begin
  Result := nil;
  DosHeader := Pointer(dwLibraryHandle);
  if (pFunctionName = nil) then
    Exit;

  if (isBadReadPtr(DosHeader,sizeof(TImageDosHeader)) or
     (DosHeader^.e_magic <> IMAGE_DOS_SIGNATURE)) then
    Exit; {Wrong PE (DOS) Header}

  NtHeader := Pointer(DWord(DosHeader^._lfanew)+DWord(DosHeader));
  if (isBadReadPtr(NtHeader, sizeof(TImageNTHeaders)) or
     (NtHeader^.Signature <> IMAGE_NT_SIGNATURE)) then
    Exit; {Wrong PW (NT) Header}

  DataDirectory := @NtHeader^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];
  if (DataDirectory = nil) or (DataDirectory^.VirtualAddress = 0) then
    Exit; {Library has no exporttable}

  ExportDirectory := Pointer(DWord(DosHeader) + DWord(DataDirectory^.VirtualAddress));
  if isBadReadPtr(ExportDirectory,SizeOf(TImageExportDirectory)) then
    Exit;

  pFirstExportName := Pointer(DWord(ExportDirectory^.AddressOfNames)+DWord(DosHeader));
  pFirstExportOrdinal := Pointer(DWord(ExportDirectory^.AddressOfNameOrdinals)+DWord(DosHeader));
  pFirstExportAddress := Pointer(DWord(ExportDirectory^.AddressOfFunctions)+DWord(DosHeader));

  if (integer(pFunctionName) > $FFFF) then {is FunctionName a PChar?}
  begin
    iExportOrdinal := -1;          {if we dont find the correct ExportOrdinal}
    for i := 0 to ExportDirectory^.NumberOfNames-1 do {for each export do}
    begin
      pExportNameNow := Pointer(Integer(pFirstExportName)+SizeOf(Pointer)*i);
      if (not isBadReadPtr(pExportNameNow,SizeOf(DWord))) then
      begin
        ExportName := PChar(pExportNameNow^+ DWord(DosHeader));
        if (ExportName = pFunctionName) then {is it the export we search? Calculate the ordinal.}
        begin
          pExportOrdinalNow := Pointer(Integer(pFirstExportOrdinal)+SizeOf(Word)*i);
          if (not isBadReadPtr(pExportOrdinalNow,SizeOf(Word))) then
          iExportOrdinal := pExportOrdinalNow^;
        end;
      end;
    end;
  end else{no PChar, calculate the ordinal directly}
    iExportOrdinal := DWord(pFunctionName)-DWord(ExportDirectory^.Base);

  if (iExportOrdinal < 0) or (iExportOrdinal > Integer(ExportDirectory^.NumberOfFunctions)) then
    Exit; {havent found the ordinal}

  pExportAddr := Pointer(iExportOrdinal*4+Integer(pFirstExportAddress));
  if (isBadReadPtr(pExportAddr,SizeOf(DWord))) then
    Exit;

  {Is the Export outside the ExportSection? If not its NT spezific forwared function}
  if (pExportAddr^ < DWord(DataDirectory^.VirtualAddress)) or
     (pExportAddr^ > DWord(DataDirectory^.VirtualAddress+DataDirectory^.Size)) then
  begin
    if (pExportAddr^ <> 0) then {calculate export address}
      Result := Pointer(pExportAddr^+DWord(DosHeader));
  end else
  begin {forwarded function (like kernel32.EnterCriticalSection -> NTDLL.RtlEnterCriticalSection)}
    ExportName := PChar(dwLibraryHandle+pExportAddr^);
    dwPosDot := Pos('.',ExportName);
    if (dwPosDot > 0) then
    begin
      dwNewModule := GetModuleHandle(PChar(Copy(ExportName,1,dwPosDot-1)));
      if (dwNewModule = 0) then
        dwNewModule := LoadLibrary(PChar(Copy(ExportName,1,dwPosDot-1)));
      if (dwNewModule <> 0) then
        result := GetProcAddressX(dwNewModule,PChar(Copy(ExportName,dwPosDot+1,Length(ExportName))));
    end;
  end;
end;
第一页 上一页 下一页 最后页 有 17 条纪录 共1页 1 - 17
 用户名:
 密 码:
自动登陆(30天有效)
 
  DELPHI盒子版权所有 1999-2023 V4.01 粤ICP备10103342号-1 更新RSS列表