MIDL2039: interface is not automation marshaling conformant, requires Windows NT 4.0 SP4 or greater The interface does not meet the requirements for an OLE Automation interface. Check to make sure the interface is derived from IUnknown or IDispatch. 贴出你的 .IDL 文件
The interface does not meet the requirements for an OLE Automation interface. Check to make sure the interface is derived from IUnknown or IDispatch. 贴出你的 .IDL 文件
//自定义枚举类型
//指令发送类型
typedef
[
uuid(21f1b5cf-7778-44f9-b7bf-166c1f816f37),
helpstring("终端控制指令类型"),
]
enum vcSendCmdType
{
[helpstring("取消指令")] vcCmdMonCancel = 0x0000,
[helpstring("定时指令")] vcCmdMonByTime = 0x0001,
[helpstring("定次指令")] vcCmdMonbySec = 0x0002,
[helpstring("等距指令")] vcCmdMonbyLen = 0x0003,
[helpstring("查询指令")] vcCmdMonbyOne = 0x0004,
[helpstring("报警")] vcCmdFreeAlarm = 0x0005,
[helpstring("发送")] vcCmdSendText = 0x0006,
} vcSendCmdType;
//自定义枚举类型 结束//自定义结构体
//系统和设备状态返回类型
typedef
[
uuid(20dc615b-e8da-4c6b-97b8-d9885304e48b),
helpstring("系统和设备状态返回类型"),
]
struct vcCmdMsg
{
[helpstring("命令序列号")] long vcCmdSerial;
[helpstring("终端标识码")] BSTR vcTerminal;
[helpstring("指令类型")] vcSendCmdType vcCmdType;
[helpstring("指令参数")] BSTR vcCmdParam;
[helpstring("指令发送时间")] DATE vcSendTime;
[helpstring("指令完成时间")] DATE vcReturnTime;
[helpstring("指令处理结果")] BSTR vcResult;
}vcCmdMsg;//自定义结构体 结束
在idl的include下
typedef struct vcCmdMsg_
{
long .....
....
}vcCmdMsg;
typedef enum vcSendCmdType_
{
.....
}vcSendCmdType;
上面实在vc6下的写法,
在.net下eg;
[export]
typedef struct vcCmdMsg_
{
long .....
....
}vcCmdMsg;
[export,v1_enum]
typedef enum vcSendCmdType_
{
.....
}vcSendCmdType;
就可以了!
{
......
}vcCmdMsg;
typedef enum vcSendCmdType_
{
......
}vcSendCmdType;
请注意:我自定义的结构体中,其中一个成员使用了自定义的枚举类型。
我的结构体全部使用VARIANT,但是还是产生MIDL2039警告,为什么“?
我做的组件被VB调用,这个结构不能被VB识别,该怎么办?
急需解决,解决后我要结贴了。
[
uuid(21f1b5cf-7778-44f9-b7bf-166c1f816f37),
helpstring("终端控制指令类型"),
]
enum vcSendCmdType
{
[helpstring("取消指令")] vcCmdMonCancel = 0x0000,
[helpstring("定时指令")] vcCmdMonByTime = 0x0001,
[helpstring("定次指令")] vcCmdMonbySec = 0x0002,
[helpstring("等距指令")] vcCmdMonbyLen = 0x0003,
[helpstring("查询指令")] vcCmdMonbyOne = 0x0004,
[helpstring("报警")] vcCmdFreeAlarm = 0x0005,
[helpstring("发送")] vcCmdSendText = 0x0006,
} vcSendCmdType;
//自定义枚举类型 结束//自定义结构体
//系统和设备状态返回类型
typedef
[
uuid(20dc615b-e8da-4c6b-97b8-d9885304e48b),
helpstring("系统和设备状态返回类型"),
]
struct vcCmdMsg
{
[helpstring("命令序列号")] long vcCmdSerial;
[helpstring("终端标识码")] BSTR vcTerminal;//********************************************************
//********************************************************
[helpstring("指令类型")] enum vcSendCmdType vcCmdType;
//********************************************************
//******************************************************** [helpstring("指令参数")] BSTR vcCmdParam;
[helpstring("指令发送时间")] DATE vcSendTime;
[helpstring("指令完成时间")] DATE vcReturnTime;
[helpstring("指令处理结果")] BSTR vcResult;
}vcCmdMsg;
请问:用VB6调用时,怎样才能把结构传送过来,请给出详细的代码。谢谢!!!
typedef struct Mystruct_
{
float x;
float y;
float z;
char w;
}Mystruct;
接口方法:
id[1] HRESULT GetStruct([our]VARIANT* data);
在方法实现中
STDMETHODIMP CXXXX::GetStruct(VARIANT* data)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
Mystuct m_struct[10];
HRESULT hr;
//create an array bound
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0; //The first (and only) collumn of our array starts at 0.
rgsabound[0].cElements = 10; //and has 10 elements.
//create the array
SAFEARRAY FAR* pMySafeArray;
pMySafeArray = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
hr = SafeArrayAccessData( pMySafeArray, reinterpret_cast<PVOID*>(&m_struct)); //Get a pointer to the data.
for(int i=0;i<10;i++)
{
m_struct[i].x=(float)i;
m_struct[i].y=(float)i;
m_struct[i].z=(float)i;
m_struct[i].w='x';
}
VARIANT myVariant;
myVariant.parray = pMySafeArray;
myVariant.vt = VT_ARRAY;
*data = myVariant;
SafeArrayUnaccessData(pMySafeArray);
return S_OK;
}就好了!
id[1] HRESULT GetStruct([our]VARIANT* data);
改为
接口方法:
[id(1)] HRESULT GetStruct([out]VARIANT* data);