COM-DLL Methoden-Rückgabetyp



  • Hi!

    Ich schreibe gerade eine COM-DLL (ATL) und habe da ein paar Probleme eine Funktion mit dem Rückgabetyp BOOL zu implementieren. Die Funktion erzeuge ich mit den Assistenten der VS 6 IDE, das klappt Bestens:

    STDMETHODIMP_(BOOL) Test::WorkerStop()
    {
    	// ZU ERLEDIGEN: Implementierungscode hier hinzufügen
    	return TRUE;
    }
    

    Alle Einträge - z.B. in die idl-Datei - werden ebenfalls automatisch erzeugt. Beim Kompilieren bekomme ich dann aber immer folgenden Fehler:

    error MIDL2269 : procedures in an object interface must return an HRESULT
    

    Durch Googeln finde ich dazu leider nur diesen Microsoft-Artikel: http://support.microsoft.com/kb/192626/en-us. Offensichtlich gibt es also eine Lösung für das Problem, aber ich verstehe sie nicht: Zitat (RESOLUTION):

    Add the [local] attribute to either the interface or the method.
    

    Kann mir da jemand helfen? Danke!

    Sebo



  • Also frei übersetzt heisst das, dass der Rückgabewert entweder in der Methode oder im Interface deklariert werden soll, aber wie soll das denn funktionieren?!?!?

    Soll das vielleicht bedeuten, dass ich den Wert den ich zurückgeben will über einen referenzierten Parameter zurückgeben soll?! Das kann's ja nicht sein, denke ich.



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum MFC (Visual C++) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    Eine Property oder eine Methode das einen BOOL returniert sieht so aus:

    STDMETHODIMP CComSomething::get_IsSomething(VARIANT_BOOL* pVal)
    

    Warum lässt Du das ganze nicht durch den MIDL erzegen? Bzw. verwendest ATL?



  • [quote="C++ Forumbot"]Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum MFC (Visual C++) verschoben.

    Diese dll ist ohne MFC ....

    Martin Richter schrieb:

    Eine Property oder eine Methode das einen BOOL returniert sieht so aus:

    STDMETHODIMP CComSomething::get_IsSomething(VARIANT_BOOL* pVal)
    

    Warum lässt Du das ganze nicht durch den MIDL erzegen? Bzw. verwendest ATL?

    Property ist mir bekannt. Mmh, ich erzeuge die Funktionsheader mit den VS 6 - Assistenten ob das MIDL ist weiss ich nicht. ATL verwende ich, weil ich eine COM dll für .NET haben will und ich im Netz keine andere Möglichkeit gefunden habe so eine dll in VS 6 zu erzeugen.


  • Mod

    Ich versteheimmer noch nicht wie Du es machst!
    Verwendest Du die IDisptach implementierung der MFC?
    Oder verwendest Du ATL?
    Wie sieht Deine idl Datei aus?

    Beschätfige Dich mal mit ATL+COM!



  • Martin Richter schrieb:

    Ich versteheimmer noch nicht wie Du es machst!
    Verwendest Du die IDisptach implementierung der MFC?
    Oder verwendest Du ATL?

    Wenn Du mich so fragst, muss ich gestehen, dass ich es nicht genau weiss. Ich denke ich nutze ATL, denn ich habe bei der Projekterzeugung ""ATL-COM-Anwendungsassistent" gewählt (und dann dll ohne MFC). Habe leider nicht viel Doku bisher gefunden, hast Du dazu vielleicht einen guten Link?

    Martin Richter schrieb:

    Wie sieht Deine idl Datei aus?

    Die sieht folgendermassen aus:

    import "oaidl.idl";
    import "ocidl.idl";
    
    	[
    		object,
    		uuid(3649938F-1A98-4778-A878-342C74BCFBF6),
    		helpstring("ITest Interface"),
    		pointer_default(unique)
    	]
    	interface ITest : IUnknown
    	{
    		[helpstring("Methode WorkerStart")] HRESULT WorkerStart(int seconds);
    		[helpstring("Methode WorkerStop")] HRESULT WorkerStop();
    		[propget, helpstring("Eigenschaft IsWorking")] HRESULT IsWorking([out, retval] BOOL *pVal);
    		[helpstring("Methode test")] BOOL test(int xyz);
    	};
    
    [
    	uuid(6DC88192-3DDC-4F3B-BA51-F72760C02CAB),
    	version(1.0),
    	helpstring("COM 1.0 Typbibliothek")
    ]
    library COMLib
    {
    	importlib("stdole32.tlb");
    	importlib("stdole2.tlb");
    
    	typedef enum eWorkerState
    	{
    		Stop = 0,
    		Start = 1
    	} WorkerState;
    
    	[
    		uuid(7EBC2254-8C8E-4878-8102-7FE8D0C85F14),
    		helpstring("Test Class")
    	]
    	coclass Test
    	{
    		[default] interface ITest;
    	};
    };
    

    Als Fehlermeldung bekomme ich an der Stelle mit dem BOOL Rückgabewert folgendes:

    COM.idl(15) : error MIDL2269 : procedures in an object interface must return an HRESULT : [ Procedure 'test' ( Interface 'ITest' ) ]
    

    . Generiert habe ich die Funktion über die Klassenansicht und habe sonst nichts weiter geändert.

    Martin Richter schrieb:

    Beschätfige Dich mal mit ATL+COM!

    Das mache ich ja gerade. 🙂


  • Mod

    Schredder doch VC6 einfach.

    Evtl. ist das dein Problem:
    http://support.microsoft.com/kb/192626



  • Martin Richter schrieb:

    Schredder doch VC6 einfach.

    Würde ich sehr gerne, aber es geht um zertifizierte Software, die in neue Technologien importiert werden soll, hab' also keine Wahl. 😡

    Martin Richter schrieb:

    Evtl. ist das dein Problem:
    http://support.microsoft.com/kb/192626

    Jep, das ist der einzige Link, den ich dazu gefunden hab'. Ich hatte eben nur gehofft, das es doch eine Möglichkeit gäbe das Problem zu umgehen. 🙄

    Danke für Deine Hilfe!


Anmelden zum Antworten