Problem mit Strings
-
Hallo Leute,
und zwar hab ich eine mit einem MFC-Projekt geschriebene Dll, welche eine Funktion zur Verfügung stellt, welche 4 char* (quasi Strings) Variablen übergeben bekommt.
Funktionsprototyp:
BOOL __declspec(dllexport) __stdcall CreateCSkript (char* BackupBlockName, char* PrgName, char* ProjName, char* ProjDir)Die Funktion rufe ich aber aus einem VB-Projekt auf. Das sieht dann wie folgt aus:
Ret = myCreateCSkript("Backup/RUECK", "Prg", "C:\\Ralf\\OS(1)\\OS(1).mcp", "C:\\Ralf\\OS(1)\\PAS\\")Es kommt folgender Fehler:
Debug Assertion Failed!
Programm: *hier kommt dann der Pfad meiner .exe*
File: strex.cpp
Line: 699Da das angegebene .cpp-File das File ist mit dem mit CStrings gearbeitet wird, denk ich, daß das Problem daran liegt, daß VB-Strings eine andere Formatierung haben, als in VC++.
Kann mir jemand sagen, wie ich das zum Laufen bekomme?
Vielen Dank für euere Hilfe
-
Gegenfrage: Welche Assertion hat denn angeschlagen? (sprich: Wo kommst du heraus, wenn du nach der Meldung den Debugger anwirfst? Und über welchen der Strings beschwert sich dein Programm?)
-
Da kann ich leider nicht viel zu sagen, weil wenn ich die dll debugge, dann funktioniert alles prima.
Ich konnte das Problem ein bischen eingrenzen: Der Fehler kommt nicht, wenn ich das Programm aus dem Visual Studio starte (6.0). Er kommt wenn ich es von außerhalb starte.
-
Ich weiß nicht, wie die Strings in VB gespeichert werden, auf C(++) Seite ist ein Strinng auf jeden Fall eine nullterminierte Zeichenkette (d.h. "Hallo" besteht aus den Elementen 'H','a','l','l','o','\0').
Wenn dein externes Programm sich nicht an diese Konvention hält, liest C++ so lange weiter im Speicher, bis es zufällig auf einen \0 Wert stößt (und zählt den ganzen Datenmüll bis dorthin mit zum String) oder den eigenen Speicher verlässt (BUMM). Du könntest ja mal zu Testzwecken nachsehen, was in deinem String ankommt, wenn du ihn von VB aus übergeben bekommst:
void __declspec(dllexport) __stdcall test(char* str,int len) { ofstream out("test.txt"); for(int i=0;i<=len;++i) out<<i<<":\t"<<str[i]<<" "<<(int)str[i]<<"\n"; }(^^ was steht in der Ausgabedatei, wenn VB diese Funktion als 'test("Hallo",5)' aufruft?)
-
Habe gerade herausgefunden, daß die Strings richtig übergeben werden.
Das Problem scheint wirklich nur daran zu liegen, daß meine Funktionalität in der dll nur funktioniert, wenn das Visual Studio offen ist.
Woran könnte das liegen?
-
Problem gelöst.
Die ganze Sch.... lag daran, daß ich meine dll nicht im Release-Modus compiliert habe.
Danke für deine Hilfe
