Announcement

Collapse
No announcement yet.

String von C++ DLL Datei nach VB übergeben

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • String von C++ DLL Datei nach VB übergeben

    Folgendes Problem, Ich will einen String von einer C++ DLL nach VB übergeben. Leider funktioniert das irgendwie net.

    Teil der DLL Datei

    #include<windows.h>
    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>

    int _stdcall Produktanzeigen(int PNr, char cText1[], char cText[], char cText3[]);

    int _stdcall Produktanzeigen(int PNr, char cText1[], char cText2[], char cText3[])
    {
    FILE *FDatei;
    FDatei=fopen("c:\\Produkte.txt", "r");
    if(!FDatei)
    {
    }
    else
    {
    do{
    fgets(cText1, 254, FDatei); //das ist einfach nur zum Testen
    }while(!feof(FDatei));
    }
    fclose(FDatei);
    return 0;
    }

    VB Teil

    Private Declare Function Produktanzeigen Lib "C:\Dokumente und Einstellungen\Maulwurf\Desktop\Praktikum\Vortrag_P roggen\Tes

    t\Kopie von Listenverkaufspreiskalk\Listenverkaufspreiskalk___ Win32_Debu

    g\Listenverkaufspreiskalk.dll" _
    (ByRef PNr As Integer, _
    ByVal cText1 As String, _
    ByVal cText2 As String, _
    ByVal cText3 As String) As Long

    Private PNr As Integer
    Private Sub Command1_Click()
    Dim ERG As Long, cText1 As String, cText2 As String, cText3 As String
    PNr = Text1
    ERG = Produktanzeigen(PNr, cText1, cText2, cText3)

    Label3.Caption = cText1
    Label5.Caption = cText2
    Label7.Caption = cText3

    End Sub

    Zur Zeit wird denk ich mal garnix Übergeben, da die Felder bei der Ausgabe leer bleiben.

  • #2
    Guten Morgen Maulwurf112,

    verzeih bitte, aber irgendwie komme ich mit der Parameterübergabe der C-Strings nicht so ganz klar! Ich muss allerdings betonen, dass ich gerade erst von der Borland C++ Builder IDE, welche ich seit diversen Jahren benutze, auf Microsoft Visual C++ umzusteigen versuche.

    Bei der Entwicklung von DLL's in C++ habe ich mit mir selbst die folgenden Konvetionen "vereinbart":

    1. String-Übergabe ausschließlich als Null terminierte C-Strings!
    2. Variable im aufrufenden Programm als Pointer deklarieren und die Speicherreservierung in der DLL vornehmen. Die Speicherfreigabe erfolgt dann wieder im aufrufenden Programm.

    In Deinem Falle sähe das ungefähr so aus:

    int _stdcall Produktanzeigen(int PNr,
    char* cText1,
    char* cText2,
    char* cText3)
    {
    int l1, l2, l3;
    FILE *FDatei;
    FDatei=fopen("c:\\Produkte.txt", "r");
    if(FDatei)
    {
    // Innerhalb der Dll- Funktion "weiß" man um die Länge der
    // einzelnen Strings innerhalb der Datei, oder kann diese
    // ermitteln. Nehmen wir also an, dle Längen seien bekannt.
    cText1 = new char[l1 + 1];
    cText2 = new char[l2 + 1];
    cText3 = new char[l3 + 1];

    fgets(cText1, l1, FDatei);
    cText1[l1] = '\0'; // String-Abschluss!

    fgets(cText2, l2, FDatei);
    cText1[l2] = '\0'; // String-Abschluss!

    fgets(cText3, l3, FDatei);
    cText1[l3] = '\0'; // String-Abschluss!

    // man kann das so einlesen, besser würde das mit EOF-
    // Kontrlle sein, aber darum geht es ja hier nicht.
    }
    }

    Nach der "Benutzung" oder Umkopierung der zurückgegebenen Strings in der aufrufenden Funktion Speicherfreigabe nicht vergessen!

    Gruß
    A-Thaddaeus

    Comment


    • #3
      Das mit dem new char ist mir etwas unklar. Was muss da jetzt hin

      Comment


      • #4
        Guten Tag Maulwurf112

        mit dem Aufruf "new" wird in C++ dynamisch Speicher für eine Variable auf dem Heap reserviert. Dazu muß entweder in der reservierenden Funktion ein Zeiger auf diese Variable deklariert werden, oder aber dieser Zeiger muß - wie in Deinem Falle - mittels Parameterübergabe an die reservierende Funktion übergeben werden.

        Leider verstehe ich von Visual Basic zu wenig, als daß ich Dir das in dieser Syntax erklären könnte. Ich muß hier auch für die aufrufende Funktion die C/C++ Syntax benutzen.

        In Kürze:

        void Aufrufende Funktion(void)
        {
        char* T1 = NULL;
        char* T2 = NULL;
        char* T3 = NULL; // Deklaration der Zeiger-Variablen
        int P;

        // Aufruf der Dll-Funktion mit übergabe der deklarierten
        // Variablen als Zeiger auf NULL:
        int _stdcall Produktanzeigen(P, T1, T2, T3);

        ...
        ...
        ...

        //Achtung!
        // Speicher erst nach Abschluß der String-Verwendung
        // oder nach Umkopierung freigeben!!!
        delete[] T1;
        deete[] T2;
        delete[] T3;
        }

        =======================================

        int _stdcall Produktanzeigen(int PNr,
        char* cText1,
        char* cText2,
        char* cText3)
        {
        int l1, l2, l3;
        FILE *FDatei;
        FDatei=fopen("c:\\Produkte.txt", "r");
        if(FDatei)
        {
        // Innerhalb der Dll- Funktion "weiß" man um die Länge der
        // einzelnen Strings innerhalb der Datei, oder kann diese
        // ermitteln. Nehmen wir also an, dle Längen seien bekannt.

        // l1 bis l3 sind die einzulesenden Stringlängen in Byte. Hierzu
        // muß jeweils ein zusätzliches Zeichen addiert werden, welches
        // das den Stríng abschließende NULL-Zeichen aufnimmt.
        cText1 = new char[l1 + 1];
        cText2 = new char[l2 + 1];
        cText3 = new char[l3 + 1];

        // nun ist Speicher für die Strings reserviert und die String-
        // Variablen können benutzt werden. Direkt nach der Übergabe ist
        // der Wert aller drei String-Variablen noch NULL ( 0 ), aber
        // nach den Aufrufen von new haben alle drei String-Variablen
        // einen Wert verschieden von NULL!

        ...
        ...
        ...
        }

        Gruß
        A-Thaddaeus

        Comment

        Working...
        X