我自定义了一个结构,编译器告诉MIDL2039错误。
请高手回答,如何解决.解决后马上给分,不够可再加。
先谢谢了。

解决方案 »

  1.   

    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 文件
      

  2.   

    我定义的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;//自定义结构体  结束
      

  3.   

    我都是这么写的:
    在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;
    就可以了!
      

  4.   

    typedef struct vcCmdMsg_
    {
       ......
    }vcCmdMsg;
    typedef enum vcSendCmdType_
    {
       ......
    }vcSendCmdType;
      

  5.   

    如果按照【 wangweixing2000】或【 zhangcrony】的说明,则产生MIDL2025和MIDL2026错误,请两位高手再仔细研究一下,望能给出切实可行的办法。
    请注意:我自定义的结构体中,其中一个成员使用了自定义的枚举类型。
      

  6.   

    有自定义的枚举类型是不行的,结构里面类型必须是VARIANT中的类型,要特别注意!你想办法把它拆开!!!我的写法我一直在用没有问题的!
      

  7.   

    【 wangweixing2000】:
         我的结构体全部使用VARIANT,但是还是产生MIDL2039警告,为什么“?
      

  8.   

    不用管,我以前也碰到过,因为接口方法的参数都应该是VARIANT类型,现在你直接用自定义结构肯定会出现警告的,不过这个不用担心,以后编译就不会再有了!我一直都这么用!哈哈!
      

  9.   

    别笑,现在出现如下故障:
         我做的组件被VB调用,这个结构不能被VB识别,该怎么办?
      
    急需解决,解决后我要结贴了。
      

  10.   

    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("指令类型")]  enum  vcSendCmdType vcCmdType;
    //********************************************************
    //********************************************************   [helpstring("指令参数")]     BSTR          vcCmdParam;
      [helpstring("指令发送时间")] DATE          vcSendTime;
      [helpstring("指令完成时间")] DATE          vcReturnTime;
      [helpstring("指令处理结果")] BSTR          vcResult;
       }vcCmdMsg;
      

  11.   

    VB传不了结构,这个得自己用VARIANT包一下!我以前也碰到过,VB6下不能但是VB.NET下可以。这次我真的不笑了,本来上次想给你说呢,不过我猜想你不会用在VB6下,哎!笑不出来了!
      

  12.   

    【wangweixing2000】:
          请问:用VB6调用时,怎样才能把结构传送过来,请给出详细的代码。谢谢!!!
      

  13.   

    在自定义结构:
    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;
    }就好了!
      

  14.   

    写错了:接口方法:
    id[1] HRESULT GetStruct([our]VARIANT* data);
    改为
    接口方法:
    [id(1)] HRESULT GetStruct([out]VARIANT* data);
      

  15.   

    我写的也能自动传递结构,我测试过就是在VB6下不行,其它EG:BCB,.NET,VC我都试过了都可以,可能是我对VB6了解不够吧!如果你知道告诉我一声,大家一块学习!