如果通过import,注册com组件方式,那么就可以不需要ps来调用

解决方案 »

  1.   

    是的,我就是编译完了com组件以后有注册,然后在我的工程里面通过#import来调用。你的意思是,可以不注册这个com组件? 在我的应用程序里面也不用import这个tlb? 只需要调用p/s这个dll,我就能和com组件通信了。是这样的吗?谢谢。
      

  2.   


    不是啊。我做了一个实验。我
    1. 建立了一个ATL工程叫做ATLProject2,立刻删除相应的PS工程及其所有文件。
    2. 给ATL工程添加一个简单的ATL对象叫做My,给My增加一个函数叫做Func,代码如下:STDMETHODIMP CMy::Func(int i, int* o)
    {
        // TODO: Add your implementation code here
        *o = i + 1;
        return S_OK;
    }然后我写一个控制台程序:#import "..\ATLProject2\Debug\ATLProject2.tlb" no_namespace
    int _tmain(int argc, _TCHAR* argv[])
    {
    CoInitialize(NULL);
    IMyPtr p;
    p.CreateInstance(__uuidof(My), NULL, CLSCTX_ALL);
            int i = p->Func(1);
            cout << i << endl;
    CoUninitialize();
    return 0;
    }
    程序打印输出2,如我的预期。所以看起来即使是跨进程调用(我的com是个exe),仍然可以不需要代理/存根?不知道我的理解有没有问题,还请指教
      

  3.   

    是的,我就是编译完了com组件以后有注册,然后在我的工程里面通过#import来调用。你的意思是,可以不注册这个com组件? 在我的应用程序里面也不用import这个tlb? 只需要调用p/s这个dll,我就能和com组件通信了。是这样的吗?谢谢。
    我是说如果注册了,同时你程序又用的import方式,那么就不需要PS了
    但是有很多情况,程序不会用import方式,那么就通过ps来做