MFC und eine Fremd DLL einbinden



  • Guten Tag an alle,
    ich muss auf der Arbeit ein Projekt, welches in C++ MFC erstellt ist, supporten. Diese Art der Programmierung ist sehr schwer zu lesen, finde ich. Aber nun zu meiner Frage:
    In dieser Anwendung habe ich eine Fremd DLL(Header Datei). Von dieser sind auch ein paar Funktionen eingebunden. Aber da ist so undurchsichtig. Ich suche schon seit vorgestern nach einem Fehler. Also das einbinden erfogt üder mehrere Dateien, wo ich den Fundktionsaufruf zum einen mit verschiedenen Übergabedatentypen anlegen muss (CString / BSTR). Das geht noch. Aber dann kommt noch eine VTBL und ein Interface dazu.
    Mache ich da etwas falsch von der Vorgehensweise, z. B. Assistenten oder ist das wirklich so kompliziert. Ich bin kein C++ MFC Programmierer.

    Bitte um Hilfe

    Mfg Torsten



  • Zeig mal die Funktion und deinen Aufruf dazu.



  • Hey,
    ich habe mal beispielhaft etwas heraus gesucht:
    \iTACInterface\IiTACInterface.h(183): virtual HRESULT STDMETHODCALLTYPE AssignSerialnumbersToWorkorder(
    \iTACInterface\IiTACInterface.h(373): HRESULT ( STDMETHODCALLTYPE *AssignSerialnumbersToWorkorder )(
    \iTACInterface\IiTACInterface.h(496):#define IiTACInterface_AssignSerialnumbersToWorkorder(This,lModulNr,bstrAuftragNr,lAuftragID,bstrSerialnumber,lSize,bstrSerialnumbers)
    \iTACInterface\IiTACInterface.h(497): ( (This)->lpVtbl -> AssignSerialnumbersToWorkorder(This,lModulNr,bstrAuftragNr,lAuftragID,bstrSerialnumber,lSize,bstrSerialnumbers) )

    \Interface\IiTACInterface.idl(44): HRESULT AssignSerialnumbersToWorkorder ([in]long lModulNr, [in]BSTR bstrAuftragNr, [in]long lAuftragID, [in]BSTR bstrSerialnumber, [in]long lSize, [in, size_is(lSize)]BSTR bstrSerialnumbers[]);
    \Interface\IiTACInterface.idl(44): HRESULT AssignSerialnumbersToWorkorder ([in]long lModulNr, [in]BSTR bstrAuftragNr, [in]long lAuftragID, [in]BSTR bstrSerialnumber, [in]long lSize, [in, size_is(lSize)]BSTR bstrSerialnumbers[]);

    \iTACInterface\iTACInterfaceImp.h(74): HRESULT AssignSerialnumbersToWorkorder (long lModulNr, CString strAuftragNr, long lAuftragID, CString strSerialnumber, CStringArray& astrSerialnumbers);
    \iTACInterface\iTACInterfaceImp.h(141): STDMETHOD(AssignSerialnumbersToWorkorder) (long lModulNr, BSTR bstrAuftragNr, long lAuftragID, BSTR bstrSerialnumber, long lSize, BSTR bstrSerialnumbers[]);

    \iTACInterface\iTACInterfaceImp.cpp(1145): SET_SUCC_HR(hr, AssignSerialnumbersToWorkorder(lModulNr, strAuftragNr, lAuftragID, strSerialnumber, astrSerialnumbers));
    \iTACInterface\iTACInterfaceImp.cpp(1697):HRESULT CiTACInterfaceImp::AssignSerialnumbersToWorkorder(long lModulNr, CString strAuftragNr, long lAuftragID, CString strSerialnumber, CStringArray& astrSerialnumbers)
    \iTACInterface\iTACInterfaceImp.cpp(1711): m_DataLogger.Log_Info(CCxGUID("63CC38C5-5895-442D-9BF5-A3BB13283569"), "CiTACInterfaceImp::AssignSerialnumbersToWorkorder() StationID = '%s'", strStationID);
    \iTACInterface\iTACInterfaceImp.cpp(1720): Cx_ERROR_STR_MSG(str, "CiTACInterfaceImp::AssignSerialnumbersToWorkorder");
    \iTACInterface\iTACInterfaceImp.cpp(1724):} // CiTACInterfaceImp::AssignSerialnumbersToWorkorder
    \iTACInterface\iTACInterfaceImp.cpp(2972):HRESULT CiTACInterfaceImp::XiTACInterface::AssignSerialnumbersToWorkorder(long lModulNr, BSTR bstrAuftragNr, long lAuftragID, BSTR bstrSerialnumber, long lSize, BSTR bstrSerialnumbers[])
    \iTACInterface\iTACInterfaceImp.cpp(2983): SET_SUCC_HR(hr, pThis->AssignSerialnumbersToWorkorder(lModulNr, strAuftragNr, lAuftragID, strSerialnumber, astrSerialnumbers));
    \iTACInterface\iTACInterfaceImp.cpp(2986):} // CiTACInterfaceImp::XiTACInterface::AssignSerialnumbersToWorkorder

    Da geht es um eine Funktion, die in in sehr vielen Dateien irgendwie rein muss. Geht das nicht einfacher?? Ich versuche dass immer zu Fuss zu machen, aber das ist mühsam.

    Danke Torsten



  • Was soll das denn jetzt sein?
    Hast du nach "AssignSerialnumbersToWorkorder" gesucht und alle Codestellen hier angegeben?

    So kann man dir nicht helfen!



  • Hey,
    ja ich dachte mir ich kann es mir so einfach machen. Die eigentliche Frage ist doch, wie bekomme ich die
    neuen Funktionen aus der ewMII.dll in das MFC C++ importiert. Wie man sieht, muss der Aufruf für die Funktion
    in einigen Dateien mit verschiedenen Datentypen im Parameter erfolgen. Und dann muss noch eine VTAble angepasst
    werden. Wie gesagt, ich mache das im Moment alles zu Fuß, in dem ich mir ein Beispiel suche und mich daran lang
    arbeite. Meistens merkert der Compiler dann wegen Datentyen herum.
    Gibt es da vielleicht einen anderen Weg?

    Es gibt doch die verschiedenen Assistenten in VIsual Studio. Ich arbeite mit der Version 2010.

    Oh man das ist echt mühsam.

    Meine aktuelle vorgehensweise:
    Ich brauch aus der emWII.dll die Funktion:
    APILONG getWorkorderForLine(APILONG sessionId, APISTRING stationNr, APISTRING workorderState, APISTRING workorder, APISTRING productNo, APISTRING partGrp, APILONG startDate, APILONG* workorderForLineSize, struct WorkorderForLine** workorderForLine, APISTRING* errorString);

    Ich arbeite folgenden Dateien der Reihe nach durch:
    IiTACInterface.h
    virtual HRESULT STDMETHODCALLTYPE GetWorkorderForLine(
    /* [in] / long lModulNr,
    /
    [in] / BSTR strWorkOrder,
    /
    [out] */ BSTR *strMasterWorkOrder) = 0;

    HRESULT ( STDMETHODCALLTYPE GetWorkorderForLine)(
    IiTACInterface * This,
    /
    [in] / long lModulNr,
    /
    [in] / BSTR strWorkOrder,
    /
    [out] */ BSTR *strMasterWorkOrder);

    #define IiTACInterface_GetWorkorderForLine(This,lModulNr,strWorkOrder,strMasterWorkOrder)
    ( (This)->lpVtbl -> GetWorkorderForLine(This,lModulNr,strWorkOrder,strMasterWorkOrder) )

    CITAC_ewMII.h
    HRESULT GetWorkorderForLine (const CString strStationID, CStringArray& strDummyID, const CString strWorkOrder, CString& strMasterWorkOrder, CString& strError);
    CITAC_ewMII.cpp
    HRESULT CITAC_ewMII::GetWorkorderForLine(const CString strStationID, CStringArray& strDummyID, const CString strWorkOrder, CString& strMasterWorkOrder, CString& strError)
    {
    HRESULT hr = S_OK;
    APILONG lRet = -1L;
    APILONG lSessionId = -1L;
    ...

    Das ganze mit Leben füllen.

    iTACInterfaceImp.h

    HRESULT GetWorkorderForLine(long lModulNr, CString strWorkOrder, CString& strMasterWorkOrder);

    STDMETHOD(GetWorkorderForLine)(long lModulNr, BSTR strWorkOrder, BSTR* strMasterWorkOrder);

    iTACInterfaceImp.cpp
    HRESULT CiTACInterfaceImp::GetWorkorderForLine(long lModulNr, const CString strWorkOrder, CString& strMasterWorkOrder)

    HRESULT CiTACInterfaceImp::XiTACInterface::GetWorkorderForLine(long lModulNr,BSTR bstrWorkOrder, BSTR* bstrMasterWorkOrder)

    Bei beiden muss darauf geachtet werden, dass die Datentypen geändert werden
    Wie gesagt was ich da mache weiß ich eigentlich nicht.

    Meistens vergesse ich die Datei:
    IiTACInterface.idl

    Eigentlich soll diese ja von der IDE erstellt werden. Passiert aber nicht. Deshalb bin ich der Meinung ich mach das falsch.

    Mfg Torsten



  • Verstehe ich das richtig: du hast eine (native) DLL "emWII.dll" (von einem Fremdhersteller) und möchtest neue Funktionen daraus aufrufen?

    Aber warum benutzt du denn dann eine COM-DLL? Wird diese noch von einem anderen Projekt benötigt oder ist das ein Client-Server-Programm mit Remote-Aufrufen?
    Ansonsten kannst du doch in dem MFC-Projekt einfach direkt die Funktionen der "emWll.dll" aufrufen (die passende Headerdatei wirst du doch sicherlich vom Hersteller erhalten haben?).

    PS. Das Forum hier unterstützt auch Code-Tags ("</>" Button neben der ComboBox), damit deine Beiträge besser zu lesen sind...



  • Hallo Th69,
    das Projekt habe ich praktisch geerbt, da mein Arbeitskollege verstorben ist. Das ganze Programm beruht auf DCom und das Programm ist programmiert in CodX Framework basierend auf C++ MFC. Das ganze Programm basiert auf Client/Server und Module.

    Wie gesagt, ich soll es supporten und teilweise erweitern.
    Ja wir haben die native Dll vom iTac System.

    Ich hatte C++ MFC vor ca. 20 Jahren beiläufig in der Ausbildung.

    Wenn Du möchtest kann ich die das Modul teilweise zur Verfügung stellen.
    Um es besser zu verstehen.

    Mfg Torsten


  • Gesperrt

    Dieser Beitrag wurde gelöscht!

Anmelden zum Antworten