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

Odpowiedz Nowy wątek
2006-08-02 22:45
Demon
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.

Pozostało 580 znaków

2006-08-02 23:47
0

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

Pozostało 580 znaków

2006-08-03 00:48
0

Też cdecl.

Pozostało 580 znaków

2006-08-03 10:04
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()").

Pozostało 580 znaków

2006-08-03 10:45
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.

Pozostało 580 znaków

2006-08-03 10:58
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;
};

Pozostało 580 znaków

2006-08-03 11:20
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?

Pozostało 580 znaków

2006-08-03 11:32
0

A usunąłeś __declspec(novtable)?

Pozostało 580 znaków

2006-08-03 11:55
0

Tak, próbowałem z i bez.

Pozostało 580 znaków

2006-08-03 12:18
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).

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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