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 rein

    EXPORTS
    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 Integer
    

    also 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 durchgesetzt

    bei fragen einfach fragen 🙂





  • hab mir mal die henkesoft-links vorgenommen...solange ich mit
    zahlen rummache gehts ja auch, aber sobald ich mit
    stringvariablen arbeiten will, haut nix hin

    STDMETHODIMP 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 😕



  • @sovok

    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 so

    CString 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 arbeiten

    weder 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


Anmelden zum Antworten