dll in visual c++ :(
-
hi leuts,
ich hab hier ien fettes problem

also, ich soll eine dll schreiben, die dann in VB zum einsatz kommen soll. leider hab ich da keinerlei erfahrungen und lesen und ne woche im internet suchen hat nix gebrach - also frag ich die experten.
ich hab versucht, die dll mit dem Alt-Com-assistenten zu erstellen...nur irgendwie weiß ich nicht, was ich dann tum soll. ich hab also ein einfaches objekt erstellt und dann ne neue klasse reingepackt. darein dann meine funktionen.
bsp:CString CStrings::MakeUpper()
{
CString str=STR;
str.MakeUpper();
return str;}
nur irgendwie hab ich das gefühl, daß da was fehlt.
in vb (keine erfahrungen) bekomm ichs auch nicht unter. habs mit project-> verweise->auswählen gemacht...tut sich aber nix

könnte mir da vielleicht jemand helfen...wäre echt nett
enrico
EDIT\\
verdammicht nochmal, bekomms nicht mal in ein c++ programm rein

hab diese zeile in die cpp datei eingefügt__declspec (dllexport) void Strings(void)
irgendwie will mich das ding nicht

-
Also erstmal musst du in der DLL den Export machen.
Um zu sehen, ob das geklappt hat kann man den PE-Explorer herunterladen
und die Export und Importtables anschauen. (Einfach PE-Explorer googeln)Zum einbinden der DLL muss man dynamisch oder statisch arbeiten.
http://www.c-plusplus.net/forum/viewtopic.php?t=82244&highlight=dll+dynamisch+laden
-
dank dir, ich versuch erstmal nach einem tut vorzugehen...ist zwar englisch, aber man gönnt sich ja sonst nix (bäääh)

mein prob ist, daß ich mit sowas noch nie was zu tun gehabt habe. also gar keinen plan habe und das was ich inner umschulung gelernt habe, scheinen dagegen klizekleine kinderpeanuts zu sein...naja, versuch mich durchzuschlagen.
enrico
-
zuerstmal müsstest du noch sagen was du genau machen willst
ich kenn zwei wesentliche möglichkeiten c++ code von vb aus aufzurufen
1. einzelne funktionen
2. klassenobjekte-für 1 erstellst du eine c++ dll
//main.cpp int EineFunktion(int val) { return val; }-fügst eine .def datei (simple textdatei) zum projekt hinzu
und schreibst reinEXPORTS EineFunktion-zum schluss schreibst du noch in dein vb projekt in etwa (bin kein vb progger)
Declare Function EineFunktion Lib "deinedll.dll" ( Val As Integer ) As Integeralso sowas
[Private|Public] Declare Function <Funktionsname> Lib "<Pfad der DLL-Datei>" (<Parameter>) As <Datentyp>das wars... aliasname brauchst du nich wenn du eine .def datei benutzt
-bei der zweiten variante benutzt du den assistenten um ein c++ activex objekt zu erstellen
-gehst dann in den class wizard und erstellst deine funktionen
-kompilierst das ganze
-lädst die von vc++ erstellte activex dll in vb
und kannst nun instanzen deiner c++ klasse in vb erstellen
(wo der menüpunkt zum laden in vb is weiss ich leider ned)methode 1 is schnell und portabel
methode 2 is einfacher, ms spezifisch und activex hat sich bei c++ programmierern nie durchgesetztbei fragen einfach fragen

-
http://henkessoft.de/api6.htm
http://download.pearsoned.de/leseecke/VCPLUS6_21Tg/data/kap17.htmDas sollte helfen.
Man kann auch COM-Technologie in einer DLL verstecken:
http://www.henkessoft.de/mfc_einsteigerbuch_kapitel15.htm\1:
http://www.henkessoft.de/mfc_einsteigerbuch_kapitel10.htm
http://www.henkessoft.de/mfc_einsteigerbuch_kapitel11.htm
http://download.pearsoned.de/leseecke/VCPLUS6_21Tg/data/kap09.htm
http://download.pearsoned.de/leseecke/VCPLUS6_21Tg/data/kap19.htm
-
hab mir mal die henkesoft-links vorgenommen...solange ich mit
zahlen rummache gehts ja auch, aber sobald ich mit
stringvariablen arbeiten will, haut nix hinSTDMETHODIMP CQuadrat::TestString(CString x, CString *y) { *y=x+"-> geschafft"; return S_OK; }(sagt nix zu dem quadrat...hab nur mal rumgetestet
)in der .idl steht folgendes drin:
[id(3), helpstring("Methode TestString")] HRESULT TestString([in] CString x,[out] CString*y);und die fehlermeldung ist:
expecting a type specification near "CString"
das problem ist aber, das ich mit der dll strings verarbeiten soll.
außerdem fehlt mir noch die möglichkeit der auswahl der methoden...ähnlich wie bei objekten mit
punkt dahinter und dann blättern.enrico
btw: wenns mich nicht so annerven würd, daß ich net kapier, hätt ichs schon aufgegeben

-
was ich machen will? mmmhh wenn ich das wüßte
nein...also. ich mach ein praktikum und hab den auftrag bekommen,
eine dll zu schreiben. das ganze in visual c++ und für vb6.
diese dll soll alle funktionen enthalten, die die klasse CString mitbringt...also späße wie insert, length usw. das prob ist, daß ich die
CString nicht nachproggen will und auch nicht fähig wäre. also alles in ne klasse rein, die methoden ähnlich benannt und mit normalen
string variablen runtergeschrieben.
was weiß ich, in etwa soCString CStringDll::MakeUpper() { CString str=STR; str.MakeUpper(); return str; }anforderungen unter vb sollen sein, eine referenz, instanz (wie auch immer das da heißt) zu erstellen. dann soll das objekt
(so heißt das bei mir) einfach nen punkt dahinter bekommen und die auswahl dastehen.und ich hab keinen plan, wie ich das machen soll

enrico
-
Es gibt keinen CString in einem COM.
Auc VB kennt keinen CString. Du musst dich an die VATTYPEN halten die beide (c++, VB) verstehen. z.B. BSTR
-
also BSTR schluckt er, aber kann ich damit auch mit zeichenketten arbeiten? wie gesagt, ich bräuchte da was zur stringverarbeitung
...am wichtigsten wäre eine art appand-funktion. könntest du mir da vielleich ein bsp geben, damit ich weiß, wie ich in etwa ran
gehen muß. wie gesagt,
die dll (oder was immer da rauskommt), sollte dann so arbeiten, als wenn ich in c++ folgendes mache:CString str;
str. [so, und hier geht jetzt ne schöne lange liste mit vielen funktionen auf]aber ihr habt mir schon richtig gut geholfen...schonmal ein
RIESEN DANKESCHÖN 
losschick, damit ich euch warm halten kann

enrico
-
ich glaub, ich gebs auf..seit einer woche fumel ich schon dran rum und nix kommt raus. von wegen statisch verlinkte dll´s, mit denen ich die mfc mit einbinden kann...irgendwie will das nich...bstr addieren? fehlanzeige

...alles immer so einfach beschrieben...doll...etliche tuts haben auch nichts gebracht...
so, jetzt geh ich erstmal eine rauchen und bin dann vielleicht nicht mehr so ganz resigniert eingestellt

enrico
-
bezüglich bstr
CString str("hallo"); CString str2("nix"); //mach nen bstr draus BSTR bstr=str.AllocSysString(); //aus bstr ein cstring machen str2 = bstr;es gibt auch ne klasse für bstrs die mit dem cstring kompatibel is
die heisst CComBSTR
CComBSTR bstr("test"); CString str ("test2");da sollte eigentlich alles gehn
bstr += str;
str +=bstr... etc.
-
ist denn CComBSTR kompatibel zu VB?
wenn ja, dann könnte es klappen...in c++ scheints schon zu funzen

enrico
-
ich hab dir ja das activex gemailt
das benutzt BSTR für den transfer von strings zwischen vb und c++cstring ist eine klasse für c++ um mit char* zu arbeiten
ccombstr ist eine klasse für c++ um mit BSTR zu arbeitenweder cstring noch ccombstr sind in vb vorhanden
in vb gibts nur String
in dem activex control kümmert sich ms darum aus deinem bstr einen vb String zu machen
am besten lässt dus dabei bis du mehr erfahrung hast (es wär auch mit vb Strings und char* zu arbeiten)
-
ok leuts, bis hierher komm ich...
also
//gibt mir zu 100% den gleichen string zurück...warum? BSTR __stdcall ChangeString2 (BSTR sValue,BSTR sValue2 ) { BSTR test; test= sValue; return (test); } //mit der hier gehts einigermaßen. nur die ausgabe ist scheiße BSTR __stdcall ChangeString () { BSTR X; X=SysAllocString(L"hallo welt aus vb"); return (X); SysFreeString(X); }ihr sehts ja,
ChangeString2 gibt mir den string richtig zurück.nur will ich nen andern anhängen und
da scheißt er mich an von wegen: zeiger können nicht addiert werden.
ChangeString gibt mir ne blöde ausgabe:
"hallo welt aus vb"
ich denke, ich brauch nicht zu sagen, was ich will
aber um 2 strings zusammenzuhängen brauch ich anscheinend das SysAllocString.
habt ihr nen tip für die konvertierung?danke
enrico