Advertisement
HwapX

DllStdCall using variant array

Apr 7th, 2014
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 1.58 KB | None | 0 0
  1. function DllStdCall(DllName: string; FuncName: string; Params: array of Variant; ForceAnsi: Boolean): Integer;
  2. var
  3.   DllHandle: Cardinal;
  4.   FuncAddr : Pointer;
  5.   I        : Integer;
  6.   TempDoub : Integer;
  7.   TempInt64: Int64;
  8.   AnsiStr  : AnsiString;
  9. begin
  10.   DllHandle := LoadLibrary(PChar(DllName));
  11.   if DllHandle = 0 then
  12.     raise Exception.Create('Can''t load dll ' + DllName);
  13.  
  14.   FuncAddr := GetProcAddress(DllHandle, PChar(FuncName));
  15.  
  16.   if FuncAddr = nil then
  17.     raise Exception.Create(FuncName + ' not found');
  18.  
  19.   for I := High(Params) downto 0 do
  20.   begin
  21.     case VarType(Params[I]) of
  22.       varInteger, varSmallint, varShortInt, varLongWord, varWord, varByte, varError, varInt64:
  23.       asm
  24.         push Integer(Params[I]);
  25.       end;
  26.       varBoolean:
  27.       asm
  28.         push Integer(Boolean(Params[I]));
  29.       end;
  30.       varDouble:
  31.       begin
  32.         TempDoub := Params[I];
  33.         asm
  34.           push TempDoub;
  35.         end;
  36.       end;
  37.       varSingle  :
  38.       asm
  39.         push Single(Params[I]);
  40.       end;
  41.       varArray:
  42.       asm
  43.         push Pointer(Params[I]);
  44.       end;
  45.       varString, varUString, varStrArg, varOleStr:
  46.       if ForceAnsi then
  47.       begin
  48.         AnsiStr := AnsiString(Params[I]);
  49.       asm
  50.         push PAnsiChar(AnsiStr);
  51.       end
  52.       end
  53.       else
  54.       asm
  55.         push PChar(string(Params[I]));
  56.       end;
  57.       varEmpty, varNull:
  58.       asm
  59.         push 0;
  60.       end;
  61.       else
  62.         raise Exception.Create('Unsuported Type');
  63.     end;
  64.   end;
  65.   asm
  66.     call FuncAddr;
  67.     mov Result, EAX;
  68.   end;
  69. end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement