标签 exe 下的文章

记几个最近写代码遇到的几个坑。

  1. 虽然Windows Api会对 C:\\Windows\\  这种双斜杠的路径做兼容处理,但是Explorer.exe并不会,在地址栏中输入C:\\这种路径是会报错的,所以explorer.exe /e,/select,文件路径 的时候一定要做下处理。

  2. 这个算是自己的坑,多线程\线程池的时候不要直接CPUCount * 2 - 1,一定要判断一下最后的的值再说。

  3. DLL HiJack可能会被杀软影响运行。

DLL与EXE之间的恩爱情仇

program Bin;
{$APPTYPE CONSOLE}

uses
  Windows;
  
Function RunApi(lpPorc :Pointer):Integer; Stdcall; external 'Test.Dll' name 'RunApi';

Var
  lpPorc :Pointer;
begin
  lpPorc := @MessageBoxW;// 这里可以自己动态加载需要的API
  RunApi(lpPorc);//传入API的内存地址
end.



library DLL;

Uses
  Windows;

Type
  TMyMessageBox = function(hWnd: HWND; lpText, lpCaption: LPCWSTR; uType: UINT): Integer; stdcall;

Function RunApi(lpPorc :Pointer):Integer;
Var
  pMessageBox :TMyMessageBox;
begin
  Result := -1;
  if Assigned(lpPorc) Then 
  begin
    pMessageBox := lpPorc;
    pMessageBox(0, 'Test', 'hahaha', 0);  //调用EXE传进来的API
    Result := 1;
  end;
end;

Exports
  RunApi;

begin
end.


通过以上代码可以在DLL中调用EXE中的API或函数

而DLL里只需要定义就行了

比如某Rat的EXE和DLL都带有通讯库这样会造成内存消耗的加大

以及DLL在动态传输时体积的增大

如果将EXE中的通讯库直接传入DLL然后由DLL直接调用进行操作体积可以减小很多