描述:
看了 《com技术内幕》 理论是有了点,但却不知道如何下手自己写一个。。。
书上的前面几章例子是由dll实现的,我想用dll写一个简单的com,我用的是vs2005
可是,我应该建立一个什么项目呢?
我现在建了一个MFC DLL。不过它自己生成的时候里面就已经存在了一个类,如下:
BEGIN_MESSAGE_MAP(CfirstComApp, CWinApp)
END_MESSAGE_MAP()
// CfirstComApp 构造
CfirstComApp::CfirstComApp()
{
// TODO: 在此处添加构造代码,
// 将所有重要的初始化放置在 InitInstance 中
}
// 唯一的一个 CfirstComApp 对象
CfirstComApp theApp;
// CfirstComApp 初始化
BOOL CfirstComApp::InitInstance()
{
CWinApp::InitInstance();
return TRUE;
}
我不知道这个是干什么用的。。。
到底应该创建一个什么项目呢?这个MFC DLL又是干什么用的啊,里面的自动生成的东西又是干什么用的啊?
是因为我的书太老了吧,很东西好像都不一样了,不能按书的步骤来了。很迷糊啊`~~
解决方案1:
唉,现在出书的通病,一上来就是 inside internal的大部头,想当年偶也是还不知道COM怎么用就先把原理研究了一溜够,恨不得自己都觉得能用汇编码个COM了还不知道怎么自动化,就没人学老外出几本cookbook的,大概是东西太少写不了多厚不咋滴赚钱吧 吼吼
进VC,生成ATL项目,不管那么多先默认了吧,记得把支持com1.0和注册选上,然后,添加类(选择简单ATL对象),程序会自动生成一个接口类和实现这个接口的实体类,如果要添加方法,在接口上右击(实体类里面会多相应的函数代码),如果要添内部函数,在实体类上右击。编译完了也就自动注册了
怎么用?只说VC的
建立一个新项目,include完了后写
#import "刚才生成的dll的地址" no_namespace
先编译下,在生成目录里面去找一个.tlh的文件,声明全在里面,下面有用
然后在函数中(只讲智能指针的)
{
::CoInitialize(NULL);
try{
I接口名Ptr = p随便起(__uuidof(实体类名));在tlh中找,一定要一致
p随便起->方法();
}
catch(_com_error e){
……
}
::CoUninitialize();
}
记得try catch一定要有
如果真的是超级新手的话,建议一上来先把上面这个玩转了再说吧,比生成和使用dll还方便。
等需要研究远调和同步什么什么的的时候在看大部头不迟。
个人观点,COM这玩意弄出来是服务于俺们的不是折磨俺们的。
借助MFC或者ATL可以免去你编写往注册表写如信息的代码和
编写那几个几乎是一成不边的导出函数。
哎 其实直接使用C++编写一个普通的DLL
在这个DLL中你导出DllGetClassObject
DllCanUnloadNow,DllRegister,DllUnRegister函数就可以了呀
然后你在运行进入cmd,然后使用rgsvr32 xxx.dll就可以在组册表中写入组件的信息了
通过调用CoCreateInstance函数传递进你的组件CLSID就可以使用这个组件了。
创建ATL Project。
MFC DLL不一定就是COM
或者干脆就win32 project吧。 解决方案5:
支持楼上
解决方案6:开发com使用atl才是正道,建议看看《atl internals》
解决方案7: 这是一个教程的网址,我照着做过,可以实现vb底下调用该控件的
http://blog.donews.com/crazyworm/archive/2004/12/16/204221.aspx
你参考一下msdn的一篇教程啊,是写atl的控件吗?
解决方案9:学COM就看ATL吧,基于模板的