Übergabe bei Funktionsaufruf



  • Servus zusammen,
    ich habe folgendes Problem beim Aufrufen meiner Funktion in einer .dll.
    Mein System besteht aus einer Planung, die eine .dll Aufruft und dabei eine Funktion in der .dll aufruft, an welche ein const char * und ein int übergeben wird. Sorry vorab dass ich meine Codeschnipsel nicht so schick einbinden konnte aber auf die schnelle habe ich die Funktion nicht gefunden.

    meine Planung:
    [code="cpp"]
    int main(void)
    {
    HINSTANCE hinstLib;
    MYPROC ProcAdd;
    BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;
    int localID = 3;
    const char * AML_Path = "\G:\\Planungssystem\\Planungssystem\\Blackboard.aml";
    // Get a handle to the DLL module.

    hinstLib = LoadLibrary(TEXT("Schweissplanung.dll"));

    // If the handle is valid, try to get the function address.

    if (hinstLib != NULL)
    {
    ProcAdd = (MYPROC)GetProcAddress(hinstLib, "FulfillsConditions");
    // If the function address is valid, call the function.

    if (NULL != ProcAdd)
    {
    fRunTimeLinkSuccess = TRUE;
    (ProcAdd)(L"Message sent to the DLL function\n");
    }
    else
    {
    printf("Die Funktion wurde nicht geladen!");
    }
    // Free the DLL module.

    fFreeResult = FreeLibrary(hinstLib);
    }
    else
    {
    printf("DLL wurde nicht gefunden!");
    }

    // If unable to call the DLL function, use an alternative.
    if (!fRunTimeLinkSuccess)
    printf("Message printed from executable\n");

    return 0;

    }

    [code="cpp"]

    Die Funktion Fulfillsconditions soll aufgerufen werden in der .dll Schweissplanung.dll.
    Das funktioniert soweit, außer dass der vorher deklarierte und initialisierte int localID und const char * AML_Path nicht übergeben werden an die Funktion in der .dll.

    Die .dll sieht folgendermaßen aus:
    [code="cpp"]
    __declspec(dllexport) bool __cdecl FulfillsConditions(const char * AML_Path, int localID)
    {

    //check ob Blackboard vorhanden
    if (!File::Exists(stringtoSysString(AML_Path))) // stringtoSysString(
    {
    //cout << "Pfad zum Blackboard nicht gefunden: " << AML_Path << endl;
    printf("\nPfad zum Blackboard nicht gefunden.\n");
    //return 0;
    }
    else
    {
    printf("\nPfad zum Blackboard gefunden\n");
    bool blackboardpfad = true;
    }

    }
    [code="cpp"]

    Der Header der .dll:
    [code="cpp"]
    class Schweissplanung
    {
    public:
    SCHWEISSPLANUNG_API bool FulfillsConditions(const char * AML_Path, int localID);
    };
    [code="cpp"]

    Meine Frage ist nun wieso die Funktion zwar aufgerufen wird, aber der int und const char * nicht?
    Wäre für jeden Hinweis dankbar!

    Grüße.



  • *Nur Code Tags gesetzt*

    seine Planung:

    int main(void)
    {
    HINSTANCE hinstLib;
    MYPROC ProcAdd;
    BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;
    int localID = 3;
    const char * AML_Path = "\G:\\Planungssystem\\Planungssystem\\Blackboard.aml";
    // Get a handle to the DLL module.
    
    hinstLib = LoadLibrary(TEXT("Schweissplanung.dll"));
    
    // If the handle is valid, try to get the function address.
    
    if (hinstLib != NULL)
    {
    ProcAdd = (MYPROC)GetProcAddress(hinstLib, "FulfillsConditions");
    // If the function address is valid, call the function.
    
    if (NULL != ProcAdd)
    {
    fRunTimeLinkSuccess = TRUE;
    (ProcAdd)(L"Message sent to the DLL function\n");
    }
    else
    {
    printf("Die Funktion wurde nicht geladen!");
    }
    // Free the DLL module.
    
    fFreeResult = FreeLibrary(hinstLib);
    }
    else
    {
    printf("DLL wurde nicht gefunden!");
    }
    
    // If unable to call the DLL function, use an alternative.
    if (!fRunTimeLinkSuccess)
    printf("Message printed from executable\n");
    
    return 0;
    
    }
    

    Die Funktion Fulfillsconditions soll aufgerufen werden in der .dll Schweissplanung.dll.
    Das funktioniert soweit, außer dass der vorher deklarierte und initialisierte int localID und const char * AML_Path nicht übergeben werden an die Funktion in der .dll.

    Die .dll sieht folgendermaßen aus:

    __declspec(dllexport) bool __cdecl FulfillsConditions(const char * AML_Path, int localID)
    {
    
    //check ob Blackboard vorhanden
    if (!File::Exists(stringtoSysString(AML_Path))) // stringtoSysString(
    {
    //cout << "Pfad zum Blackboard nicht gefunden: " << AML_Path << endl;
    printf("\nPfad zum Blackboard nicht gefunden.\n");
    //return 0;
    }
    else
    {
    printf("\nPfad zum Blackboard gefunden\n");
    bool blackboardpfad = true;
    }
    
    }
    

    Der Header der .dll:

    class Schweissplanung
    {
    public:
    SCHWEISSPLANUNG_API bool FulfillsConditions(const char * AML_Path, int localID);
    };
    


  • Daß Schweissplanung::FulfillsConditions() und FulfillsConditions() nichts miteinander zu tun haben, ist dir klar, gell?

    Lies mal http://www.codeproject.com/Articles/28969/HowTo-Export-C-classes-from-a-DLL



  • Ich denke genau da liegt das Problem, aber wie konkret kann ich das lösen?
    Auf die Seite, die du mir geschickt hast, bin ich schon gestoßen, aber leider bringt die mich nicht ganz so weiter.

    Danke für die Antwort bisher!



  • Warum willst du überhaupt dynamisch die DLL aufrufen?

    Binde die Header der DLL in dein Haupt-Projekt ein und füge die LIB-Datei (der DLL) als Import-Modul in den Linker-Einstellungen hinzu.

    BTW: Bist du hier überhaupt im richtigen Subforum, weil dein Code ist ja reines C++ und kein C++/CLI???


Log in to reply