mfc ocx 控件开发需要注意的问题

来源:互联网 发布:js 判断数组 编辑:程序博客网 时间:2024/06/06 03:29

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.ocxCVAPIV200.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); 

 

 

 

 

 

 

 

0 0
原创粉丝点击