aus C++ DLL String o.ä. an VB zurückgeben!
-
Übrigens: Wenn ich in VB die Methode als "AS LONG" definiere, dann bekomm ich einen Wert zurück..alerdings nur ein "1347046" statt der Mac-Adresse. Ist das die Long-Versioneiner Speicheradresse? Ich versteh es sowieso nicht (c++-Newbie): ich bekomm ja einen POINTER con c++ zurück...und den pointer weiß ich einer variable zu...aber müsste ich nicht eigentlich das, worauf der Pointer zeigt, in die Variable speichern?? Wenn ja => Wie?
-
in C++ hat ein char 1 Byte, in VB sieht die Sache ein wenig anders aus.
Da hat ein String nämlich 10 Byte. EDIT: Einzelnes char gibt's da eh net.Hier ein Link für dich: http://www.activevb.de/rubriken/kolumne/kol_4/cpptovbtypen.html
-
Danke GPC, den Link habe ich natürlich shcon vor stunden entdeckt *gg* Dort steht auch nur C++ Type = char* => VB-Type = String. Sollte also so gehen.
-
wenn ich deine string-Methode von vb aufruf, kackt alles ab.
Assembler hier (Fehler tritt in 3. zeile auf):
[...]
1000133F mov cl,byte ptr [eax]
10001341 mov edx,dword ptr [ebp-4]
10001344 mov byte ptr [edx],cl
10001346 push 0
10001348 mov ecx,dword ptr [ebp-4]
1000134B call 10001620
10001350 mov eax,[1000D124]
10001355 push eax
10001356 push 0
[...]
-
Eh sorry, aber es ist schon 4 jahre her, dass ich das letzte mal was ernsthaft mit VB gemacht habe .
Dort steht auch
Alle Zeigertypen (also datenTyp *varName oder erweiterte C++-Typen mit den Anfangsbuchstaben "LP" (für long pointer)) werden mit dem Long-Datentyp in Visual Basic implementiert (Ausnahme ist char*)
wobei (wie du sagtest):
char* -> String
char[NUM_OF_CHARS] -> String * NUM_OF_CHARSDas auch schon gelesen: http://pub13.ezboard.com/fvisualbasicexplorerfrm36.showMessage?topicID=214.topic ??
-
Ja, hab ich leider auch shcon gelesen. Der Typ macht's mit BSTR wobei das bei mir auch nicht funzt.
Angenommen der Long-Wert den die Funktion zurückgibt ist die SPeicheradresse. Weißt du zufällig, wie ich dann in VB den Wert der Speicheradresse auslesen kann?
-
forsakingmax schrieb:
Ja, hab ich leider auch shcon gelesen. Der Typ macht's mit BSTR wobei das bei mir auch nicht funzt.
Fleißig gesucht hast du ja, Respekt.

Angenommen der Long-Wert den die Funktion zurückgibt ist die SPeicheradresse. Weißt du zufällig, wie ich dann in VB den Wert der Speicheradresse auslesen kann?
Adresse eines Zeigers kriegst du so raus:
char *p = "XYZ"; cout<<&p;Der Long Wert, den du zurückkriegst, ist der andersweitig interpretierbar, evtl. nach Mac - Adresse?
-
Jetzt hab ich mal in der DLL folgenden Funktion registriert:
(bei deiner string-variante schmeirt er ja ab):
char* test() {
char* str;
str="huihuihui";
return str;
};ruf ich jetzt die Funktiion in VB auf, kommt wengistens schonmal keine fehlermeldung - der string, der zurückkommt, ist aber trotzdem leer.
Private Declare Function test Lib "C:\Program Files\Microsoft Visual Studio\MyProjects\mr\Release\mr.dll" () As String
myTest = test()
-
Der Longwert ist nicht als MAC-Adresse interpretierbar, höchstens als Adresse => der Schmäh ist ja, dass auch bei diser schlanken Funktion eine Zahle 294584358 zurückkommt, wenn ich die funktion in vb auf LONG umstelle.
-
http://www.flipcode.com/articles/article_vbdlls.shtml
Ließ da mal den Abschnitt über Strings da steht auch wie man sie returned. Wichtigster Satz:
In order to return a string, a system function must be called to properly allocate memory for it. Otherwise, the string will disappear when the function terminates and the client will receive garbage.
-
char* test() { char* str; str="huihuihui"; return str; };Sorry, das funzt so nicht. Wenn schon:
char* _stdcall test() { static char str[]="huihuihui"; cout<<"Wert: "<<str<<'\n'; cout<<"Adresse: "<<&str<<'\n'; return str; };Was ergeben sich nun für Werte?
EDIT: Pellaeon recht geb

-
mal was anderes einwerf, auch wenns daran jetzt evtl nicht liegt: VB kann doch nur stdcall benutzen dachte ich. Wenn ich deine Funktion sehe, die du exportierst, hast du ja kein __stdcall mit hingeschrieben ...
-
@GPC: doch, meine Variante funzt. Wenn ich die funktion in C++ aufrufe, haut alles hin. Gleiche wert bei deiner variante.
@Pellaeon: Was bedeuted __stdcall dazuzuschreiben? Habs getan, macht aber no difference.
asdrubael, das klingt gut, schau ich mir mal an! Danke!
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.