Ich habe einen COM-Server mit einem Verfahren für eine ganze Zahl zur Zeit der Rückkehr:Wie kann ich einen benutzerdefinierten Typ (UDT) in einem COM-Server verwenden?
[
object,
uuid("..."),
dual,
helpstring("IMyCOMServer Interface"),
pointer_default(unique)
]
__interface IMyCOMServer : IDispatch
{
[id(1), helpstring("method MyQuery")]
HRESULT MyQuery([in] BSTR instr, [out,retval] int* outint);
};
Dies kompiliert gut, aber ich würde lieber eine Enumeration zurück: (dieser Code tatsächlich über der Schnittstellendefinition ist)
typedef
[
uuid("..."),
v1_enum,
helpstring("Enum")
]
enum {
value_a,
value_b,
value_c
} MyEnum;
Welche wieder gut von seinem eigenen Recht kompilieren, aber sobald ich die int*
zu MyEnum*
in der Schnittstelle und Implementierung ändern, erhalte ich Linkerfehler:
[id(1), helpstring("method MyQuery")]
HRESULT MyQuery([in] BSTR instr, [out,retval] MyEnum* outint);
error MIDL2025 : syntax error : expecting a type specification near "MyEnum"
Egal wie ich es mache, ich kann es nicht kompilieren.
Dank Euro Micelli es stellt sich heraus, dass das eigentliche Problem ist, dass meine User Defined Type (die ENUM) wurde es in der generierten IDL-Datei nicht zu machen. Nach Online-Forum-Anfragen zu urteilen, scheint dies ein häufiges Problem zu sein.
Ein Blog-Artikel Star Tech: UDT (User Defined Types) and COM führte mich auf den richtigen Weg. Es scheint, dass ein Workaround bei Verwendung von attributierten ATL benötigt wird.
Zusammengefasst habe ich folgende Änderungen:
Erstellt udt.idl
:
import "oaidl.idl";
import "ocidl.idl";
[
uuid("..."),
v1_enum,
helpstring("Enum")
]
typedef enum MyEnum {
value_a,
value_b,
value_c
} MyEnum_t;
[
version(1.0),
uuid(...),
helpstring(...)
]
library MyLibrary
{
enum MyEnum;
}
Hinzugefügt wurde die folgende Zeile vor dem Modul Attribut in der Haupt .cpp
-Datei, so dass die obige IDL in die importiert wird generierte Datei:
[importidl("udt.idl")];
Können Sie versuchen, enum AA {}; HRESULT MyQuery ([out, retval] enum AA *) 'Ich erinnere mich, dass midl ein sehr' C'-Verhalten hatte (keine automatischen typedefs). – Ismael
Welchen Compiler benutzen Sie? –
@John Dibling: Visual Studio 2005 (aus irgendeinem Grund bin ich nicht auf ein Upgrade auf 2008 gekommen). – Mat