我遇到一个十分讨厌的DISP_FUNCTION_ID参数映射问题,希望高手能够指点迷津。
我在MFC的ActiveX工程中定义了一个结构体,并希望把这个结构体作为一个方法的参数暴露出去。
在MyInt.idl文件中这样定义:
[uuid(...), version(1.0), helpfile("MyInt.hlp"), control]
library MyIntLib
{
  importlib(STDOLE_TLB);typedef [uuid(...)]
  struct tagPerson{
  int age;
}Person;
[uuid(...)]
dispinterface _DMyInt{
  properties:
  methods:
    [id(1)] void Grows([in]Person* p);
};
[uuid(...)]
dispinterface _DMyIntEvents
{
  properties:
  methods:
};
[uuid(...), control]
coclass MyInt
{
  [default] dispinterface _DMyIM;
  [default, source] dispinterface _DMyIMEvents;
};
};编译idl文件后,好象得到了一个MyIntidl.h文件,在MyIntCtrl.h中定义了一个方法:
#include "MyIntidl.h"
class CMyIntCtrl : public COleControl
{
  ......
public:
  enum {
    dispidGrows = 1L,
  };
protected:
  void Grows(Person* p);
};在MyIntCtrl.cpp中定义为:...BEGIN_DISPATCH_MAP(CMyIMCtrl, COleControl)
  DISP_FUNCTION_ID(CMyIMCtrl, "Grows", dispidGrows, Grows, VT_EMPTY, VTS_PVARIANT)
END_DISPATCH_MAP()...void CMyIntCtrl::Grows(Person *p)
{
  if(p != NULL) p->age ++;
}这样可以成功编译出一个OCX,但是,当在VB中使用这个OCX时,会出数据类型错误:
VB中:
Dim p As Person
p.age = 10
MyInt1.Grows p ' <== 就在这里出了数据类型错误。我想应该是DISP_FUNCTION_ID中参数映射出了错误,可是我几乎尝试了各种参数映射,都是一样的错误。当然,我可以不需要这样暴露参数,但我面临的工程十分庞大,不这样暴露参数会使得接口难以维护。我当然相信使用COM技术能够以这种方式暴露参数。所以,在这里我需要你的帮助。

解决方案 »

  1.   

    你去CODEPROJECT里找一下,好象用VARIANT包装一下,可以实现.
      

  2.   

    http://www.vckbase.com/document/viewdoc/?id=1404LZ参考一下上面的链接
      

  3.   

    你这个自定义结构用在普通COM接口上是没有问题的但是你的组件是ActiveX实现的是IDispatch接口,IDispatch接口中必须使用自动化兼容数据类型,很遗憾IDispatch应该不支持自定义结构体。可以参考《ATL开发指南》中的第四章 接口、接口定义语言和调度,其他COM书籍有介绍分派接口的部分也会有介绍。
      

  4.   

    vocanicy 说得最明白,虽然这个问题没有得到解决,还是结了算了,谁叫我们一定要使用微软的技术呢。