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