请教在纯C/C++中调用OCX的方法。以下是我现在所知道的内容的代码,也是某英文网站上面摘来的,上面的例子能用
请教在纯C/C++中调用OCX的方法。
以下是我现在所知道的内容的代码,也是某英文网站上面摘来的,上面的例子能用:
C/C++ code#include "stdafx.h"#include <iostream>#include <windows.h>#include <cassert>#import "c:/ITDetector.ocx" \no_namespace no_smart_pointers raw_interfaces_only \raw_native_types no_implementation named_guids/* * */int _tmain(int argc, _TCHAR* argv[]){ CoInitialize(0) ; { IiTunesDetector* pitd = 0 ; HRESULT hr = CoCreateInstance( CLSID_iTunesDetector,//Com对象标识符 0,//指向接口IUnknown指针 CLSCTX_ALL,//运行可执行代码上下文 IID_IiTunesDetector,//Com对象接口标识符 reinterpret_cast<void**>(&pitd)//用来接收指向Com对象接口地址指针变量 ); assert( SUCCEEDED(hr) ) ; long version = 0 ; //★ hr = pitd->get_iTunesVersion( &version ) ; assert( SUCCEEDED(hr) ) ; std::cout << "iTunes version is " << std::hex << std::showbase << version << '\n' ; pitd->Release() ; } CoUninitialize() ;}
步骤是:
1、import你的OCX库
2、CoInitialize(0)之后,CoCreateInstance取得一个实例
3、调用
4、Release()
5、CoUninitialize()
虽然不太明白是干啥用的,但是能用了。如果有好心人用比MSDN浅显的语言来描述一下工作流程的话,万分感谢。
现在,问题是这样的:
我用另外的OCX导进去之后,如果不调用这个com里面的方法,编译通过,
但是如果在★处,加入调用方法的语句,比如:pitd->AboutBox()的话,会出现LNK2019和LNK1120的错误。
找了一下,说要这个ocx对应的lib也放进去,我手上是不可能拿到这个东西的。
请问一下,具体正确的做法应该是怎么样,或者说我这个错了,错在哪里。
请各位指教。
[解决办法]接口没有定义或定义没有找到
[解决办法]自己断步跟踪调试一下:首先确保pitd初始化成功,如果成功还有这个问题那就是你的那个COM里没有提供AboutBox()这个接口。
[解决办法]你摘要的东西,估计是需要RMB的东西,你可以到网上搜索一下你缺少的库,看有没有好心人提供出来。
[解决办法]如果你用另外的ocx文件,他应该还提供其他的一些文件,或者是lib,或者是.h,要不你怎知道这个OCX提供什么接口啊。
[解决办法]也有可能参数用错了
[解决办法]纯C++不包含系统API
你用了win32 的api也不纯了
[解决办法]首先,接口就是vTable
#import "c:/ITDetector.ocx" \
no_namespace no_smart_pointers raw_interfaces_only \
raw_native_types no_implementation named_guids
加入这句第一次Build之后会生成ITDetector.tlh在你的Debug或者Release目录下,把ITDetector.tlh Include进来你就可以使用ITDetector.ocx中包含的接口了。
ITDetector.ocx会包含tlb的资源,.tlb文件中是保存了接口的名字、规范及其他信息等(也就是idl文件的描述信息)。#import这句会用工具读取ITDetector.ocx中的tlb资源,然后翻译成C++的接口版本生成到ITDetector.tlh文件,事实上就是接口定义而已,因为你需要调用某个方法只需要知道类GUID、接口GUID、接口方法的偏移、接口方法的参数及返回值类型就可以了。
1、import你的OCX库 //想办法弄到接口的定义,如果你有或者自己写可以跳过该步
2、CoInitialize(0) //初始化COM库,干些什么事我不太清楚,反正就是告诉系统你的这个线程要开始用COM组件了(有计数器)
3、CoCreateInstance取得一个实例
//获得一个COM实例,实际工作是根据CLSID去注册表找到模块路径(就是c:/ITDetector.ocx)
//然后LoadLibrary,把c:/ITDetector.ocx装入进程
//再用GetProcAddress获取DllGetClassObject的方法地址
//再调用DllGetClassObject,把CLSID传进去,它会返回这个类的工厂接口(组件需要自己写代码实现工厂)
//再调用工厂接口的CreateInstance把对象创建起来,并返回这个接口,同时调用一次AddRef
4、调用 //虚方法调用而已
5、Release() //减少引用计数,当引用计数为0是,对象被释放(组件需要自己实现)
6、CoUninitialize() //告诉系统,你这个线程不再使用COM组件了(有计数器)
[解决办法]顶一下
[解决办法][解决办法]应该是这个ocx本身的实现还依赖其它的库吧,楼主查一个depend先。
[解决办法]搞个智能指针不是很清爽么...
[解决办法]http://msdn.microsoft.com/en-us/library/ezzw7k98(vs.80).aspx
[解决办法]但是如果在★处,加入调用方法的语句,比如:pitd->AboutBox()的话,会出现LNK2019和LNK1120的错误。
你的OCX中没有包含AboutBox方法吧?或者AboutBox方法不是你定义的接口中的方法