读书人

请问在纯C/C++中调用OCX的方法

发布时间: 2012-05-01 12:48:58 作者: rapoo

请教在纯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组件了(有计数器)
[解决办法]

顶一下
[解决办法]
探讨
首先,接口就是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文…


[解决办法]
应该是这个ocx本身的实现还依赖其它的库吧,楼主查一个depend先。
[解决办法]
搞个智能指针不是很清爽么...
[解决办法]
http://msdn.microsoft.com/en-us/library/ezzw7k98(vs.80).aspx
[解决办法]
但是如果在★处,加入调用方法的语句,比如:pitd->AboutBox()的话,会出现LNK2019和LNK1120的错误。

你的OCX中没有包含AboutBox方法吧?或者AboutBox方法不是你定义的接口中的方法

读书人网 >VC/MFC

热点推荐