interfejs pisany w c++ w dll, a użycie go w Delphi

0

Witam, oto co chcę zrobić na test:

plik dll pisany w c++:

#include <stdio.h>

struct __declspec(novtable) ITest
{
  virtual void Print() = 0;
  virtual void Release() = 0;
};

struct cTest: public ITest
{
  void Print() {printf("cTest::Print()");};
  void Release() {delete this;};
};

typedef ITest* LPTEST;

__declspec(dllexport) void CreateTest(LPTEST* test)
{
  *test = new cTest;
};

użycie pliku dll w Delphi:

type

ITest = interface
  procedure Print; cdecl;
  procedure Release; cdecl;
end;

LPTEST = ^ITest;
LPPTEST = ^LPTEST;

procedure CreateTest(test: LPPTEST); cdecl external 'Test.dll' index 1;

var
  t: LPTEST;
begin
  CreateTest(@t);
  t^.Print;  // tu wywala jakiś błąd podczas działania programu
  t^.Release;
end.

Nioe wiem dlaczego to niedziała, może wy pomożecie.

0

W Delphi masz konwencję cdecl, a w C++ co jest???

0

Też cdecl.

0
  
CreateTest(@t);
t^.Print;  // tu wywala jakiś błąd podczas działania programu
t^.Release;

Usuń wywołanie Print i zobacz czy działa Release. Jeśli działa to znaczy, że coś nie tak z printf("cTest::Print()").

0

Po usunięcie funkcji Print i rekompilacji dll, oraz usunięciu Print w deklaracji interfejsu w Delphi nadal to samo. Co cieklawe jak w implementacji interfejsu, czyli w cTest dodam konstruktor w którym dam printf z jakimś komunikatem to ten komunikat się dobrze wyświetla, czyli funkcja CreateTest prawidłowo tworzy obiekt klasy cTest.

0

Hmm może coś nie tak robisz od strony delphi? Nie wiem w czym kompilujesz kod C++, ale zawsze określaj konwencję wywołania dla funkcji/metod eksportowych - w VC domyślną konwencją jest thiscall, a tej nie ma w BCB/Delphi. Spróbuj w ten sposób:

struct ITest
{
  virtual void __cdecl Print() = 0;
  virtual void __cdecl Release() = 0;
};

struct cTest: public ITest
{
  void __cdecl Print() {printf("cTest::Print()");};
  void __cdecl Release() {delete this;};
};

__declspec(dllexport) void __cdecl CreateTest(ITest** test)
{
  *test = new cTest;
};
0

Próbowałem w ten sposób, próbowałem też z stdcall, zmieniając jednocześnie w kompilatorze object pascala. Aha kompiluję aktualnie pod FreePascal z włączoną opcją kompilatora zgodności z Delphi, może to wina tego kompilatora?

0

A usunąłeś __declspec(novtable)?

0

Tak, próbowałem z i bez.

0

Dziwne... od strony C++ to musi działać. Być może błąd jest w kodzie Delphi albo coś z tym FreePascal'em jest nie tak (mało prawdopodobne).

1 użytkowników online, w tym zalogowanych: 0, gości: 1