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是这样调用的,没用问题。。