Kopilierungsfehler - Datentypproblem ? statische/nichtstatischer Methodenaufruf?



  • Hallo Leute,

    habe hier eine Fehlermeldung, mit der ich absolut nichts anfangen kann, leider.

    Und zwar versuche ich mich gerade ein bisschen unseren OPC-Client zu erweitern.

    Hierfuer gibt es in einer Headerdatei eine vorgegebenen struct-Datentyp, sowie eine Klassenmethode:

    Datentyp:

    typedef struct  tagOPCBROWSEELEMENT
        {
        /* [string] */ LPWSTR szName;
        /* [string] */ LPWSTR szItemID;
        DWORD dwFlagValue;
        DWORD dwReserved;
        OPCITEMPROPERTIES ItemProperties;
        }	OPCBROWSEELEMENT;
    

    Dieser Datentyp wird als letzter Uebergangsparameter bei der nachfolgenden Funktion benoetigt, hier werden die Rueckgabewerte der Serveranfrage hinein geschrieben:

    Die Funktion ist so in der Headerdatei implementiert:

    virtual HRESULT STDMETHODCALLTYPE Browse( 
                /* [string][in] */ LPWSTR szItemID,
                /* [string][out][in] */ LPWSTR __RPC_FAR *pszContinuationPoint,
                /* [in] */ DWORD dwMaxElementsReturned,
                /* [in] */ OPCBROWSEFILTER dwBrowseFilter,
                /* [string][in] */ LPWSTR szElementNameFilter,
                /* [string][in] */ LPWSTR szVendorFilter,
                /* [in] */ BOOL bReturnAllProperties,
                /* [in] */ BOOL bReturnPropertyValues,
                /* [in] */ DWORD dwPropertyCount,
                /* [size_is][in] */ DWORD __RPC_FAR *pdwPropertyIDs,
                /* [out] */ BOOL __RPC_FAR *pbMoreElements,
                /* [out] */ DWORD __RPC_FAR *pdwCount,
                /* [size_is][size_is][out] */ OPCBROWSEELEMENT __RPC_FAR *__RPC_FAR *ppBrowseElements) = 0;
    
        };
    

    Nun mache ich in meiner cpp-Datei eine Funktion, die so ausschaut:

    void OPC_Browse(OPC_ARGS& opc_args)
    {
    	OPCBROWSEFILTER dwBrowseFilter = OPC_BROWSE_FILTER_ALL;
    	int *bMoreElements = false;
    	DWORD *szElementArray = 0;
    	OPCBROWSEELEMENT **pElementArray;
    	DWORD *dwPropertyCnt = 0;
    
    	IOPCBrowse::Browse(NULL			/* Name of branch -> NULL: no branch specified */
    						, NULL		/* Continuation Point -> NULL: Continuation Point will nto be set */
    						, 100		/* Max Elements Returned */
    						, dwBrowseFilter	/* Enumeration: 1= All, 2=Branch, 3=Items */
    						, NULL		/* Filter */
    						, NULL		/* Vendor Filter */
    						, true		/* return all properties */
    						, true		/* return properties values in addition to properties name */
    						, NULL		/* An Array of Properties ID */
    						, dwPropertyCnt /* Number of Property-IDs */
    						, bMoreElements /* Return Value, if MaxElements reached */
    						, szElementArray /* Return Size of Element Array */
    						, pElementArray); /* Array of Elements returned by Server */
    
    }
    

    Ich mache nichts anderes, als die vorgegebene Funktionen mit ihren Datentypen aufzurufen. Beim letzten Uebergabeparameter bringt mir jedoch der Compile folgende Fehlermeldung:

    Fehlerbeschreibung:
    d:\psi-opc\opcclpsi\opc_v1\opc_v1.cpp(1348) : error C2352: 'IOPCBrowse::Browse' : Unzulaessiger Aufruf einer nichtstatischen Member-Funktion
    d:\psi-opc\opcclpsi\opc_v1\opcda.h(3494) : Siehe Deklaration von 'Browse'

    Vielleicht kann mir ein Experte zumindest naeher bringen, welchen Fehler ich hier mache? Bzw. wie ich den letzten Parameter aufrufen soll, es hat mit sicherheit etwas mit den Adressuebergaben zu tun, oder?

    Waere nett, wenn mir jemand dabei helfen koennte...

    Vielen Dank schonmal an alle 🙂



  • Wenn ich richtig sehe, rufst du da eine nicht statische Funktion auf ohne vorher das zugehörige Objekt zu erzeugen. Ich weiss zwar nicht was IOPCBrowse sonst so macht aber Du kannst mal folgendes versuchen:

    IOPCBrowse iopcBrowse;
        iopcBrowse.Browse( NULL            /* Name of branch -> NULL: no branch specified */
                            , NULL        /* Continuation Point -> NULL: Continuation Point will nto be set */
                            , 100        /* Max Elements Returned */
                            , dwBrowseFilter    /* Enumeration: 1= All, 2=Branch, 3=Items */
                            , NULL        /* Filter */
                            , NULL        /* Vendor Filter */
                            , true        /* return all properties */
                            , true        /* return properties values in addition to properties name */
                            , NULL        /* An Array of Properties ID */
                            , dwPropertyCnt /* Number of Property-IDs */
                            , bMoreElements /* Return Value, if MaxElements reached */
                            , szElementArray /* Return Size of Element Array */
                            , pElementArray); /* Array of Elements returned by Server */
    

    statt IOPCBrowse::Browse(...)

    Viel Erfolg 🙂



  • Hi Biasto,

    ich habe "OPC-Client" gelesen. Dann noch ein aufruf von ***IOPCBrowse::Browse(..)***, da gehen bei mir die Alarmglocken an!

    OPC, ich denke mal, du arbeitest dabei mit einem Toolkit, das auf DCOM basiert. Dafür spricht ja auch IOPCBrowse.

    Nun, Ich habe mal einen OPC Server implementiert. Daher meine Reaktion. Generell kannst du, wie connan es richtig kommentierte, ohne eine Objekt-Instanz (sei es dynamisch auf dem Heap, oder wie connan vorgeschlagen hat, als Instanz auf dem Stack) eine nicht static funktion nicht aufrufen.

    Speziell in Deinem Falle aber denke ich, Du musst etwas tiefer in DCOM einsteigen. IOPCBrowse ist (so sehe ich das aus dem Namen) ein vom ClassWizard erzeugtes Interface. Dieses "Ding" wird irgendwo erzeugt, und zwar mit einer Funktion namens CoCreateInstance(..) oder CoCreateInstanceEX(..).

    So, und damit wird das IOPCBrowse erzeugt, und kann durchaus verwendet werden. Aber der Zugriff muss dabei ggf. über QueryInterface(..) erfolgen.

    Zum Thema COM/DCOM gibt z.B. es unter http://www.codeproject.com/com/hellotutorial1.asp den Einstieg. Das hat auch mir sehr geholfen, die Zusammenhänge etwas besser zu verstehen.

    Gruss, Gio



  • Hallo Gio,
    danke fuer deine Antwort!

    Ich gehe mal stark davon aus, das du recht hast, bei IOPCBrowse handelt es sich um ein Interface.

    Kannst du mir evtl. 'ne Idee geben, wie ich dieses Interface bzw. vielmehr die Methoden nutzen kann
    Es handelt sich hierbei um eine idl-Datei, die ich aus der Spezifikation implementiert habe!

    Instanziere ich dieses Objekt, dann kommen Fehlermeldungen das virtuelle Methoden nicht definiert wurden.

    Waere nett, wenn mir da jemand nochmals helfen koennte.
    Vielen Dank aber schonmal fuer die gegeben Hinweise.


  • Mod

    Du hast die Antwort schon bekommen. Erzeuge das entsprechende Objekt, oder besorge Dir den entsprechenden Zeiger auf das Interface von einen bestehenden Objekt mit einem entsprechenden Methodenaufruf oder Property oder eben QueryInterface.

    Objekte werden mit CoCreateInstance(Ex) erzeugt!

    Besorg Dir entsprechenden Beispielcode. Ohne genaues wissen über die COM-Objekt Struktur wird Dir da kaum einer helfen können. Oder wedne Dich an den Hersteller und frage nach Beispieln.


Anmelden zum Antworten