Einzelnen Beitrag anzeigen

bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.124 Beiträge
 
Delphi 11 Alexandria
 
#1

C++ builder / DELPHI DLL - Übergabe von String

  Alt 23. Okt 2016, 08:55
ich will Teile unserer Delphi Anwendung von einem C++ Modul aus nutzen , hierzu soll nun Delphi Code via DLL verwendet werden . Wir wollen ohne sharemem die Daten (Strings) austauschen.


der Code in der DLL sieht wie folgt aus

Delphi-Quellcode:
var aDatabase : TDatabase;

function Database_create ( server, database, objecttablename, libtablename: PChar; bufsvr, bufdb, bufobj, buflib : Word) : Pointer; stdcall;
begin

  aDatabase:= TDatabase.create(String(server), String(database),
    String(objecttablename), String(libtablename));

  result := aDatabase;
end;


function Database_ElementCount : Integer ;
begin
  result := aDatabase.ElementCount;
end;
zum Testen der DLL gibt es eine kleine Delphi Anwendung

Delphi-Quellcode:

/// Definition Funktion aus DLL
function Database_create(server, database, objecttablename,
  libtablename: PChar; bufsvr, bufdb, bufobj, buflib: Word): Pointer; stdcall;
  external 'databaseDLL.dll';


procedure TForm_database_create_DLLClick
  (Sender: TObject);
var
  server, database, objecttablename, libtablename: string;
begin
  server := lbledt_server.Text;
  database := lbledt_database.Text;
  objecttablename := 'table_name1';
  libtablename := 'tablename2';

  Database_create(PChar(server), PChar(database),
    PChar(objecttablename), PChar(libtablename), length(server),
    length(database), length(objecttablename), length(libtablename));

end;

ich kann mich auf die Datenbank verbinden und Daten lesen / schreiben, alles scheint zu funktionieren.

Nun der Versuch diese ´Datenbank auch via C++ Builder / DLL anzusprechen

in der Header Datei die Definition der Funktiosnprototypen


Delphi-Quellcode:
   
        VoidIn_IntOut Database_ElementCount ;
   StrStrStrStrIn_VoidOut Database_create;
in dann in der *.cpp Datei dann die eigentliche Implementierung

Delphi-Quellcode:

extern "C" __declspec(dllimport)
   StrStrStrStrIn_VoidOut __stdcall Database_create(char*, char*,
   char*, char*, int, int, int, int);





Database_create = (StrStrStrStrIn_VoidOut)::GetProcAddress
         (load, "Database_create");





void __fastcall TForm1::btn_create_classClick(TObject *Sender) {
   char* server = "localhost\\sqlexpress";
   char* database = "mydatabasetest";
   char* obj = "table1";
   char* lib = "table2";

   Database_create(server, database, obj, lib, 0, 0, 0, 0);
}



hierzu nun meine fragen

a) den Zeiger auf die in der DLL erzeugt Datenbank Klasse lasse ich beim Delphi Testprogramm "undefiniert", ist dies ein Fehler ?
b) der eigentlich Fehler liegt aber in der Umwandlung von PChar im Delphi Code nach Char* im C++ code. Alles als PAnsiChar zu deinieren hat aber leider auch nicht geholfen.


Was mache ich also falsch ?

Ergänzung :

C++ Builder und Delphi XE 2 , alles x32

Geändert von bernhard_LA (23. Okt 2016 um 20:37 Uhr)
  Mit Zitat antworten Zitat