Call Delphi CLASS exported in DLL from C++ code

。_饼干妹妹 提交于 2021-02-04 21:39:14

问题


i have a problem to use delphi class from C++ code. delphi dll demo that export a function that return an object. my delphi Dll code is as follow:

 library DelphiTest; 
 // uses part....
 type
 IMyObject = interface
   procedure DoThis( n: Integer );
   function DoThat : PWideChar;
end;
TMyObject = class(TInterfacedObject,IMyObject)
   procedure DoThis( n: Integer );
   function DoThat: PChar;
end;
// TMyObject implementation go here ...
procedure TMyObject.DoThis( n: Integer );
begin
 showmessage('you are calling the DoThis methode with '+intToStr(n) +'parameter');
end;

function TMyObject.DoThat: PChar;
begin
  showmessage('you are calling the DoThat function');
  Result := Pchar('Hello im Dothat');
end;

// exporting DLL function :

function CreateMyObject : IMyObject; stdcall;export;
var
 txt : TextFile;
begin
  AssignFile(txt,'C:\log.log');
  Reset(txt);
  Writeln(txt,'hello');
  Result := TMyObject.Create;
end;

exports  CreateMyObject;

in my C++ project i declared the IMyObject interface as follow :

   class IMyObject
    {
       public:
         IMyObject();
         virtual ~IMyObject();
         virtual void DoThis(int n) = 0;
         virtual char* DoThat() = 0;
    };

and my main function as follow :

typedef  IMyObject* (__stdcall *CreateFn)();

int main()
{
HMODULE hLib;
hLib = LoadLibrary(L"DelphiTest.dll");

assert(hLib != NULL); // pass !!
CreateFn pfnCreate;
pfnCreate = (CreateFn)GetProcAddress((HINSTANCE)hLib, "CreateMyObject");

if (pfnCreate == NULL)
{
    DWORD errc = GetLastError();
    printf("%u\n", errc); // it gets error 127

}
else{
    printf("success load\n");
}
   IMyObject*  objptr = pfnCreate();
   objptr->DoThis(5);
   FreeLibrary(hLib);
   int in;
   scanf_s("%i", &in);
   return 0;
 }

with this example i got an error at run time when i try to access the exported function. the errors is at line : IMyObject* objptr = pfnCreate();

can you tell me what is wrong about my example. and if possible any working example to access Delphi class (in DLL) from C++ code.


回答1:


The first problem is calling convention of the methods. The Delphi interface uses register which is a Delphi specific calling convention. Use stdcall, for example, for the methods of the interface.

The next problem is in the C++. Your C++ interface must derive from IUnknown. Further, it should not declare a constructor or destructor.

Beyond that your Delphi code exports PWideChar which does not map to char*. It maps to wchar_t*.

Looking further ahead, returning a PChar works fine here because your implementation returns a literal. But more serious code will want to use a dynamically allocated string presumably and at that point your design is flawed.

Do note that you need to be an elevate administrator to create a file at the root of the system drive. So that's yet another potential failure point.

I expect there are other mistakes, but that's all I've found so far.



来源:https://stackoverflow.com/questions/35508818/call-delphi-class-exported-in-dll-from-c-code

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!