C++ dll uzyte w delphi

0

Witam, na zajęcia muszę napisać program w znienawidzonym przeze mnie Delphi, niestety muszę stworzyć własną dll`ke. Na szczęście może byc ona w c++. Teraz mam taki problem, iż ciągle mam błędy naruszenia dostępu, bądź przeciążenia stosu.
Bibliotekę dopiero zacząłem pisać, na razie nic tam nie ma tylko prosta funkcja na której sprawdzam czy w ogóle zadziała :D

.h

extern "C" __declspec (dllexport)  void add (int *a); 

.cpp

#include "file-sqllib.h"

extern "C"
{
     __declspec (dllexport)  void add (int *a)
    {
        //return a+b;
    }
} 

A w delphi mam coś takiego:

......
procedure Add(a: PInteger); stdcall external 'file-sqllib/Debug/file-sqllib.dll' name 'add';

procedure TForm1.FormCreate(Sender: TObject);
begin
    Add(@licznik);
.......

Problem pojawia sie gdy chce przesłać do funkcji jakąś wartość, bez wysyłania błędy się nie pojawiają.

Z gry dziękuję za odpowiedź.

0

cdecl a nie stdcall

0

Wielkie dzięki :D

0

hehe teraz błędy są jak próbuje zwrócić jakaś wartość :D

0

jeszcze jedno, zamiast

procedure Add(a: PInteger);

możesz daćprocedure Add(var a:integer);

robi to to samo co referencja w C++<code class="cpp">void Add(int &a)

ponadto zamiana referencji na wskaźnik podczas importu jest bezpieczna: dll-ka może eksportować funkcję ze wskaźnikiem, a importujesz funkcję z referencją — albo odwrotnie.

0

Ehhhh, nic nie działa, staram sie wysłać adres i nic to nie daje ;/ dalej w programie nie ma zadnych wartosci tablicy przypisanych w dll`ce ;/ Masakra, juz nawet pomyslu nie mam co robic :P

Hmmmm, zauważyłem, że w ogole nie wywołuje mi tej funkcji biblioteczne, tylko nie wiem jaka może byc tego przyczyna :/

0

"nic nie działa" to pojęcie bardzo względne od czarnego ekranu bo ktoś pociągnął procesor , lub sprzątaczka wyłączyła listwę ;)

Tak z ciekawosci to dlaczego DLL nie zrobisz w delphi ?
Kolejna sprawa czym kompilujesz C++ , gcc czy vc, a jak gcc to z czego , cygwin czy mingw ? BO tutaj jest troche problemów .

Program sie uruchamia czy też Od razu zawiesza ?
Czy na pewno deklaracja funkcji z dll jest OK ?
Myślałeś o dynamicznym ładowani DLL

var add: procedure (var a: Integer); cdecl;

DLLHandle := LoadLibrary('file-sqllib/Debug/file-sqllib.dll');
if DLLHandle > 0 then
begin
@add:= GetProcAddress(DLLHandle,'add');
{$IFDEF WIN32}
Assert(@add<> nil);
{$ENDIF}
end;

0

Problem rozwiązany :D, na jakimś forum przeczytałem, używaj tylko prostych typów danych. Pod żadnym pozorem string :D i faktycznie działa. A teraz mam takie pytanko, chciałbym w dllce napisać funkcje łączenia się z baza danych. Problem jest taki iż w programie w delphi mam obiekt TSQLConnection i mógłbym do dllki wysłać wskaźnik na obiekt, aczkolwiek nie mam pojęcia jak w mojej dll`ce zaimportować druga w której jest zadeklarowany owy obiekt :D I dzięki za napisanie o dynamicznym łączeniu :D

0

Pod żadnym pozorem string
podajesz przykład z intem, po cichu używasz stringa, i narzekasz że „nic nie działa”?

0

Jakoś nie widzę szans aby w DLL było w stanie coś zrobić z TSQLConnection , bo co Ci po wskaźniku jak nie będziesz w stanie z niego skorzystać ?

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