如何连接COM呀? 包含你在TestCOM工程中的TestCOM.h里面有ISum的定义看你的工程还需要在开头加上#define _WIN32_DCOM 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不行呀!?我按你说的改了后编译器给出了错误提示说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 valued:\microsoft visual studio\myprojects\study2\temp.cpp(8) : error C2078: too many initializersd:\microsoft visual studio\myprojects\study2\temp.cpp(14) : error C2065: 'CoInitalizeEx' : undeclared identifierd:\microsoft visual studio\myprojects\study2\temp.cpp(14) : error C2065: 'COINIT_APARTMENTTHREADE' : undeclared identifierd:\microsoft visual studio\myprojects\study2\temp.cpp(17) : error C2065: 'IDD_IUnknown' : undeclared identifierd:\microsoft visual studio\myprojects\study2\temp.cpp(19) : error C2065: 'COUT' : undeclared identifierd:\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 identifierd:\microsoft visual studio\myprojects\study2\temp.cpp(32) : error C2065: 'COUninitialize' : undeclared identifierError 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/////////////////////////////////////////////////////////////////////////////// CInsideCOMclass 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()// ISumpublic: STDMETHOD(Sum)(int x,int y,/*[out retval]*/ int* sum);};#endif //__INSIDECOM_H_ 哦,是我一时写错了好多。现在改过来了,虽可通过编译但不能连接,不知道是怎么回事,提示错误是。Compiling...temp.cppD:\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 valueLinking...temp.obj : error LNK2001: unresolved external symbol _IID_ISumtemp.obj : error LNK2001: unresolved external symbol _CLSID_InsideCOMDebug/study2.exe : fatal error LNK1120: 2 unresolved externalsError 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-95BD280A2BEFconst 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();} 在你的COM项目中编译后会生成一个TESTCOM_i.h文件,里面有你接口的说明,就用这个头文件 #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> sorry:写错了,应该是:#import "..\myproject\test\testatl.dll" no_namespace named_guids 使用我的办法肯定可以!! 需要接口声明和几个ID(CLSID,IID)的头文件TestCOM.h!!! 很感谢,问题已解决了。不能包含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} ISumconst 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();} 很奇怪的类间指针相互引用问题 如何截获消息,不让它继续默认操作 一个VC语句的问题,所以想问问大家? 高分求助:关于ATL COM ASP第一次调用正常,关闭IE再调用时就出现莫名的错误 线程之间的sleep会不会互相影响?? 用ODBC连接数据库存储大块数据问题... CListCtrl显示文件目录的问题 三地招聘vc++程序员,想来的都可以试试看, 编写控件时对话框继承的问题,在线回答给分 有三个问题请高手答,先谢谢啦! 请教如何在LISTVIEW控件里加入背景图象? how to 怎样在线程中修改状态栏
我按你说的改了后编译器给出了错误提示说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_
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();
}
如果你用到诸如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>
写错了,应该是:#import "..\myproject\test\testatl.dll" no_namespace named_guids
需要接口声明和几个ID(CLSID,IID)的头文件TestCOM.h!!!
不能包含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();
}