1)activex ocx 中需要调用第三方dll,lib;而第三方的库编译是用c++ builder编译的,vs2008直接调用.lib 有问题;需要转换;
C++Builder生成DLL,VC调用。
1、用extern "C"修饰C++Builder导出的DLL函数。如:extern "C" __declspec(dllexport) int aFunc(int a);
2、用C++Builder的impdef工具生成DLL对应的def文件。如:impdef xxx.def xxx.dll。
3、用记事本打开xxx.def文件,删去每个函数名前的"_"。如原来的def文件为:
C/C++ code
LIBRARY XXX.DLL
EXPORTS
___CPPdebugHook @2 ; ___CPPdebugHook
_aFunc @1 ; _aFunc
那么删除后就变成了:
C/C++ code
LIBRARY XXX.DLL
EXPORTS
__CPPdebugHook @2 ; ___CPPdebugHook
aFunc @1 ; _aFunc
4、用VC的LIB工具,根据上面的def文件生成lib文件。如:lib.exe /DEF:XXX.def /MACHINE:IX86,在vc的安装目录下对应的lib.exe目录下运行。生成lib文件之后,VC便可以使用这个lib文件;
2)准备cabarc.exe工具,可以从微软官方下载使用运行如下命令进行打包:
CABARC.exe -s 6144 N "xxxxxx.cab" "xxxxx.ocx" "mwhrf_bj.dll" "xxxxxx.inf"[version]
其中xxxx.inf内容如下:
[version] signature="$CHICAGO$" AdvancedINF=2.0 [Add.Code] MyTestActiveX.ocx=MyTestActiveX.ocx CVAPIV200.dll=CVAPIV200.dll [MyTestActiveX.ocx] file=thiscab clsid={4A89CA80-B5C4-41D5-B150-8FC73A85E641} FileVersion=1,0,0,1 RegisterServer=yes DestDir=11
其中clsid:
只有需要注册的ocx文件才设置这个属性,他的值就是改ocx的唯一classid,可以从项目的.idl文件中最下方查找;(uuid)
3)vs2008 如何调试activex控件;activex调试工具
C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\TstCon32.exe
vs2008的TstCon32.exe需要自己编译,直接在网上下载vc6.0的TstCon32.exe;在vs2008的菜单工具栏,点外部工具,弹出对话框;
标题:ActivexOcxTestTool
命令:C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\TstCon32.exe
然后点应用;在工具菜单中选择ActivexOcxTestTool,运行TstCon32.exe;
此时弹出标题为:ActiveX control Test Container ;
在Edit菜单中选择insert new control,选择我们的ocx控件,然后在control菜单中选择invoke methods 就可以调试.ocx中的函数了;
4)因为.ocx中又调用了第三方的库文件,使用动态加载dll的方法;LoadLibrary dll 失败问题;
解决办法:
hdll=NULL;
TCHAR chCurDir[MAX_PATH] = {0};
GetCurrentDirectory(MAX_PATH, chCurDir);
SetCurrentDirectory(_T("E:\\Debug\\"));
hdll = LoadLibrary(_T("CVAPIV200.dll"));
SetCurrentDirectory(chCurDir);