包含你在TestCOM工程中的TestCOM.h里面有ISum的定义
看你的工程还需要在开头加上#define  _WIN32_DCOM

解决方案 »

  1.   

    不行呀!?
    我按你说的改了后编译器给出了错误提示说d:\microsoft visual studio\myprojects\study2\temp.cpp(7) : warning C4305: 'initializing' : truncation from 'const int' to 'unsigned char'
    d:\microsoft visual studio\myprojects\study2\temp.cpp(7) : warning C4309: 'initializing' : truncation of constant value
    d:\microsoft visual studio\myprojects\study2\temp.cpp(8) : error C2078: too many initializers
    d:\microsoft visual studio\myprojects\study2\temp.cpp(14) : error C2065: 'CoInitalizeEx' : undeclared identifier
    d:\microsoft visual studio\myprojects\study2\temp.cpp(14) : error C2065: 'COINIT_APARTMENTTHREADE' : undeclared identifier
    d:\microsoft visual studio\myprojects\study2\temp.cpp(17) : error C2065: 'IDD_IUnknown' : undeclared identifier
    d:\microsoft visual studio\myprojects\study2\temp.cpp(19) : error C2065: 'COUT' : undeclared identifier
    d:\microsoft visual studio\myprojects\study2\temp.cpp(19) : error C2297: '<<' : illegal, right operand has type 'char [25]'
    d:\microsoft visual studio\myprojects\study2\temp.cpp(28) : error C2065: 'SUCCEDED' : undeclared identifier
    d:\microsoft visual studio\myprojects\study2\temp.cpp(32) : error C2065: 'COUninitialize' : undeclared identifier
    Error executing cl.exe.study2.exe - 8 error(s), 2 warning(s)我的COM是用ATL做的,在ATL中添加COM组件。我的TestATL.h文件如下。
    // InsideCOM.h : Declaration of the CInsideCOM#ifndef __INSIDECOM_H_
    #define __INSIDECOM_H_#include "resource.h"       // main symbols/////////////////////////////////////////////////////////////////////////////
    // CInsideCOM
    class ATL_NO_VTABLE CInsideCOM : 
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CInsideCOM, &CLSID_InsideCOM>,
    public IDispatchImpl<ISum, &IID_ISum, &LIBID_TESTATLLib>
    {
    public:
    CInsideCOM()
    {
    }DECLARE_REGISTRY_RESOURCEID(IDR_INSIDECOM)DECLARE_PROTECT_FINAL_CONSTRUCT()BEGIN_COM_MAP(CInsideCOM)
    COM_INTERFACE_ENTRY(ISum)
    COM_INTERFACE_ENTRY(IDispatch)
    END_COM_MAP()// ISum
    public:
    STDMETHOD(Sum)(int x,int y,/*[out retval]*/ int* sum);
    };#endif //__INSIDECOM_H_
      

  2.   

    哦,是我一时写错了好多。现在改过来了,虽可通过编译但不能连接,不知道是怎么回事,提示错误是。Compiling...
    temp.cpp
    D:\Microsoft Visual Studio\MyProjects\study2\temp.cpp(7) : warning C4305: 'initializing' : truncation from 'const int' to 'unsigned char'
    D:\Microsoft Visual Studio\MyProjects\study2\temp.cpp(7) : warning C4309: 'initializing' : truncation of constant value
    Linking...
    temp.obj : error LNK2001: unresolved external symbol _IID_ISum
    temp.obj : error LNK2001: unresolved external symbol _CLSID_InsideCOM
    Debug/study2.exe : fatal error LNK1120: 2 unresolved externals
    Error executing link.exe.study2.exe - 3 error(s), 2 warning(s)什么是未解决外部组件(unresolved external symbol )呀?这个提示我看不太懂叶,还请大虾帮忙!我的console文件如下:
    #define  _WIN32_DCOM#include <iostream.h>
    #include "..\TestATL\TestATL.h"//28BCFB61-7DB3-4FDB-B1FC-95BD280A2BEF
    const CLSID CLSID_Inside={0x28bcfb61,0x7db3,0x4fdb,0xb1fc,
    0x000000000001};void main()
    {
        IUnknown* pUnknown;
        ISum* pSum;
        HRESULT hr=CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);
        if(FAILED(hr))
            cout<<"CoInitalizeEx failed"<<endl;
        hr=CoCreateInstance(CLSID_InsideCOM,NULL,CLSCTX_INPROC_SERVER,IID_IUnknown,(void**)&pUnknown);
        if(FAILED(hr))
           cout<<"CoCreateInstance failed."<<endl;
        hr=pUnknown->QueryInterface(IID_ISum,(void**)&pSum);
        if(FAILED(hr))
            cout<<"IID_ISum not supported"<<endl;
        pUnknown->Release();    int sum;
        hr=pSum->Sum(2,3,&sum);    if(SUCCEEDED(hr))
            cout<<"Client:Calling Sum(2,3)="<<sum<<endl;
        pSum->Release();    CoUninitialize();
    }
      

  3.   

    在你的COM项目中编译后会生成一个TESTCOM_i.h文件,里面有你接口的说明,就用这个头文件
      

  4.   

    #import "你的atl dll 完整的路径和文件名" no_namespace named_guids
    如果你用到诸如A2W、OLE2T等函数,应定义USES_CONVERSION宏,加上头文件#include "atlbase.h"。
    example:
    #include <windows.h>
    #include <iostream.h>
    #include "..\myproject\test\testatl.dll" no_namespace named_guids
    #include <atlbase.h>
      

  5.   

    sorry:
    写错了,应该是:#import "..\myproject\test\testatl.dll" no_namespace named_guids
      

  6.   

    使用我的办法肯定可以!!
      需要接口声明和几个ID(CLSID,IID)的头文件TestCOM.h!!!
      

  7.   

    很感谢,问题已解决了。
    不能包含TestATL_i.c文件,编译器会报错的。只要把InsideCOM和ISum接口的CLSID定义好后就可以了。#define  _WIN32_DCOM#include <iostream.h>
    #include "..\TestATL\TestATL.h"//{28BCFB61-7DB3-4FDB-B1FC-95BD280A2BEF} InsideCOM
    //{10000001-0000-0000-0000-000000000001} ISum
    const CLSID CLSID_Inside=
    {0x28bcfb61,0x7db3,0x4fdb,{0xb1,0xfc,0x95,0xbd,0x28,0x0a,0x2b,0xef}};
    const CLSID IID_ISum=
    {0x10000001,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}};void main()
    {
        IUnknown* pUnknown;
        ISum* pSum;
        HRESULT hr=CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);
        if(FAILED(hr))
            cout<<"CoInitalizeEx failed"<<endl;
        hr=CoCreateInstance(CLSID_Inside,NULL,CLSCTX_INPROC_SERVER,IID_IUnknown,(void**)&pUnknown);
        if(FAILED(hr))
          cout<<"CoCreateInstance failed."<<endl;
        hr=pUnknown->QueryInterface(IID_ISum,(void**)&pSum);
        if(FAILED(hr))
            cout<<"IID_ISum not supported"<<endl;
        pUnknown->Release();    int sum;
        hr=pSum->Sum(2,3,&sum);    if(SUCCEEDED(hr))
            cout<<"Client:Calling Sum(2,3)="<<sum<<endl;
        pSum->Release();    CoUninitialize();
    }