Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Calling DLLs with pointers in Delphi

I am new to Delphi. I have a DLL with the following exported function in it:

bool __stdcall MyFunction(char * name, int * index)  

This code which calls this DLL function in C++ works perfectly:

typedef void (WINAPI * MyFunction_t)(char *, int *);
void main()
{
    HMODULE mydll = LoadLibrary(L"C:\\mydll.dll");
    MyFunction_t MyFunction = (MyFunction_t)GetProcAddress(mydll, "MyFunction");

    int index = 0;

    MyFunction("MyString", &index); 
}

I need to do the same in Delphi. Here is my code, which is not working (MyFunction gets called but the index variable doesn't receive the appropriate value). This is a code excerpt so please ignore disorder. Any input would be much appreciated!

type
  TMyFunction= function(name: PChar; var index_ptr: Integer): Boolean; stdcall;

var
  fMyFunction : TMyFunction;
  i : Integer;
  h: THandle;

begin
  Result := 0;
  h := LoadLibrary('c:\\mydll.dll');
  fMyFunction := GetProcAddress(h, 'MyFunction');
  if @fMyFunction <> nil then
  begin
    fMyFunction('MyString', i);
    Result := i;
  end;
  FreeLibrary(h);
end;
like image 929
Ron Avatar asked Aug 12 '26 00:08

Ron


1 Answers

First of all I am assuming that you are using C linkage with extern "C" in case this function is defined in a C++ translation unit.

If you are using Delphi 2009 or later, you need to be aware that PChar is a pointer to a null-terminated wide character string.

To interop with your ANSI C function you need to use:

type
  TMyFunction= function(name: PAnsiChar; var index: Integer): Boolean; stdcall;

The C bool type is probably best mapped to LongBool since it's not quite the same as a Delphi Boolean:

type
  TMyFunction= function(name: PAnsiChar; var index: Integer): LongBool; stdcall;

You don't need to escape \ in strings so you can write:

h := LoadLibrary('c:\mydll.dll');

You probably ought to check for errors on the call to LoadLibrary and, technically, h is an HMODULE rather than a THandle, although that won't cause you any problems.

Idiomatic Delphi would be to write:

  if Assigned(fMyFunction) then
    fMyFunction('MyString', Result);

Basically it looks reasonable to me but I'm most suspicious of the character width.

Hope that helps.

like image 56
David Heffernan Avatar answered Aug 14 '26 16:08

David Heffernan



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!