C++ builder 调用VC 封装的dll组件

         C++builder调用自己写的组件或者VC写的dll,还是很方便的,但是过程中会有很多细节问题,

 

         我很负责人的想骂网上那些不不负责任,写出方法,直接粘贴别人方法的,不整理的,乱讲的,代码都有问题的童鞋们。你们真是作风不严谨,写代码不认真。。

         给别人制造难度就是给自己制造难度。。

 

        1.。。C++builder静态调用VC的dll方法

                  1.首先就是对dll的转换,C++builder 6.0,有这个工具。。

                       你只需要     运行--》cmd---》implib    xxx.lib   xxx.dll        ,DOS窗口,在你的默认目录下面放上你的dll,     implib    xxx.lib   xxx.dll 转化成功后就会在相同目录下生成一个lib库

                       转换成c++builder可用的lib库, 首先要保证你的lib库写的是没有问题的,不然就算你能转换通过,你还是会遇到很多错误导致你用不了

 

                 2,调用的过程中,你要写一个头文件,就是定义你的输出函数。。

#include <tchar.h>
#include "AitalkSample.h"
#include <crtdbg.h>
#include <stdlib.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifdef _BUILD_DLL_
#define FUNCTION __declspec(dllexport)
#else
#define FUNCTION __declspec(dllimport)
#endif

FUNCTION int __stdcall OutResult(char *p);    //这就是输出函数,
FUNCTION void __stdcall ReadDestroy();

#ifdef __cplusplus
}  /* End of the 'extern "C"' block */
#endif

                 3.调用时这样用。 就可以直接用你库里面的函数了。。

                    封装输出函数的时候最好这样写。

                    extern  "C"  _declsped(dllexport) int   Result(char *p);           //extern  "C" 这个是保证你的输出函数不会乱码的,在使用前你最好用工具查一下你的输出函数名。。(eXeScope.exe这个工具就可以);        

 

                 #include "xxxxx.h"
                 #pragma comment(lib,"xxxx.lib")   //你的库的名字。。   

               void __fastcall TForm1::FormOnCreate(TObject *Sender)
                 {
                        Result("指令菜单");//这个函数就是你库里面的函数。。
                 } 

          

                 2,动态调用的方法,

                    有可能你的库在C#里面可以用,但是在C++builder里面不能用,这就说明你的库是没问题的,那就动态调用。。

 

                        2 .1现在头文件里面定义一个输出函数指针类型。。

                             typedef int  __stdcall (*ReadT)(char *);         //int是你的输出函数的返回类型,,ReadText1是定义的函数指针类型,(char *)是你的参数类型,

 

                              {

                                       //现获取链接库入口地址
                                       HINSTANCE hins;
                                       ReadT  lpfnRegister;           //定义ReadT类型的指针      在上面已经定义的
                                       hins=LoadLibrary("Asound.dll");

                                     

                                    //
                                    if(hins==NULL)
                                    {
                                             Application->MessageBox("调用动态库失败","提示",MB_OK);
                                    }
                                   else
                                   {
                                            lpfnRegister = (ReadT)GetProcAddress(hins,"ReadText");
                                           //ReadText 是Asound.dll中的函数  ,这里要强制转换
                                            lpfnRegister("你妹妹");

                                           //这里代替了你的函数ReadText(char*p);//你的库里面的函数原型
                                            FreeLibrary(hins);
                                   }
                             }

 

                         //这样就没用问题了,两种调用方法。。

                        我用C++封装的两个组件  朗读组件Asound.dll 和识别组件 Aitalk.dll  是C++ builder是这样调用的,没用问题。。

 

                    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值