在ADO中可以把创建的ADOconnect对象作为参数传递给
RecordeSet,我如何能够实现相同的功能呢?
我要输出一个对象让用户设定一些属性值,然后把这个对象传递给
另外一个对象进行处理。
在对象创建时我定义了双接口,但是我不太清楚在ATL中如何使用,
希望高人指点。
我建立的demo程序为:
定义一个simple object,有一个属性pp,支持get和put方法
interface Ia1 : IDispatch
{
[propget, id(1), helpstring("property pp")] HRESULT pp([out, retval] long *pVa
l);
[propput, id(1), helpstring("property pp")] HRESULT pp([in] long newVal);
};
定义另外一个simple object,调用a1,希望得到a1的属性
interface ICalla1 : IDispatch
{
[id(1), helpstring("method calla1")] HRESULT calla1([in]VARIANT a1);
};                                                  ~~~~~~~~
1.输入参数类型有一定的疑惑,是否一定要用VARIANT类型
2.如何在calla1的方法中得到a1中的值呢?在调用Com对象的三种方法中
在使用tlb类型库通过classwizard建立一个类
#import “tlb"
在Com自身都是不适用的,因为tlb在编译后才生成。
真是不知道如何做,从前做的Com只是封装函数,看来还是没有掌握Com的精髓啊!

解决方案 »

  1.   

    1. 当然可以不用VARIANT类型,可以使用IDispatch*, Ial*.
    2.
    ICallalImpl::callal(VARIANT al) {
        if (al.vt != VT_DISPATCH)
            return E_INVALIDARG;
        Ial *p = al.pdispVal;
        ...
    }
    3. 在COM Project本身是不需要import的,因为编译器可以根据idl文件生成.h文件.
      

  2.   

    老乌龟说得很好!
    我这里有个DEMO,不知道你需要否?
      

  3.   

    当我用Ia1 *p = a1.pdispVal进行赋值时,VC6报告错误:
    cannot convert from 'struct IDispatch *' to 'struct Ia1 *'
    问一下:Ia1使用的是Vtable接口类型,IDispatch接口能和Ia1进行直接赋值吗?
      

  4.   

    建议用这样的方法:
    IDispath *pDispath = al.pDispVal;
    Ial *p;
    HRESULT hr = pDispath->QueryInternface(p);
    if(SUCCEEDED(hr))
    {
       .............//do the thing you want to do
    }
      

  5.   

    现在的问题变成了如何使用传人的Variant类型的变量得到
    该对象的方法和属性。
    我不太想直接使用IDispatch->Invoke()感觉太复杂了!
    能不能使用Com Interface(VTable)方式来处理!如何将Dispatch接口转换成IA1的形式呢?
    请执教!