VC写的DLL,在VB,BCB,Delphi中如何使用???

zxyjyzxyjy 2005-12-30 10:22:31
在VC中申明函数如下:
extern "C"
{
_declspec(dllexport) bool __stdcall ReadRegComConfig();
_declspec(dllexport) bool __stdcall InitCommPort();
_declspec(dllexport) void __stdcall UnInitCommPort();
_declspec(dllexport) bool __stdcall SetCommPara(char *commname);
_declspec(dllexport) bool __stdcall GetData(char *data,int *size);
}

同时在其def文件中加入:
EXPORTS
; Explicit exports can go here
ReadRegComConfig;
InitCommPort;
UnInitCommPort;
SetCommPara;
GetData;
本人在VB,BCB,Delphi中从没使用过VC写的DLL,所以如上导出的函数,最好能给出详细的解答。
...全文
203 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
pomelowu 2005-12-30
  • 打赏
  • 举报
回复
http://www.yesky.com/20011206/208621_2.shtml

对delphi不熟。呵呵~
zxyjyzxyjy 2005-12-30
  • 打赏
  • 举报
回复
至于在VB中调用,本人已解决。

现只剩下Delphi中的问题了。
zxyjyzxyjy 2005-12-30
  • 打赏
  • 举报
回复
在BCB中的调用已解决,对VC产生的DLL,在BCB中要能使用(静态调用),只需对DLL执行如下两个命令:
implib mydll.lib mydll.dll
impdef mydll.def mydll.dll
把产生的两个文件mydll.lib和mydll.def加入到BCB工程中,当然mydll.dll也要放到BCB参能查到的地方,同时在BCB工程中申名相应的函数如我的例子中的:
extern "C"
{
__declspec(dllimport) bool WINAPI ReadRegComConfig();
__declspec(dllimport) bool WINAPI InitCommPort();
__declspec(dllimport) void WINAPI UnInitCommPort();
__declspec(dllimport) bool WINAPI SetCommPara();
}
这样就可在BCB工程中正确调用了。
zxyjyzxyjy 2005-12-30
  • 打赏
  • 举报
回复
客户要求提供一个动态库,至于该动态库在什么语言中使用是不确定的。为了自已测试一下这个动态库在各环境下是否正确,所以还得学习那些语言并使用VC编的动态库了。:):)
zxyjyzxyjy 2005-12-30
  • 打赏
  • 举报
回复
非常谢谢 pomelowu(羽战士) !!!

我要求的是我上面说的情况下导出的DLL在VB,BCB,Delphi中如何使用。也就是说动态库仅一个版本,其它语言就这个版本的DLL该如何正确使用该动态库。最好是按上面的导出函数例子各做一个使用列子。
handsomerun 2005-12-30
  • 打赏
  • 举报
回复
偶忘记了,VB中如果没有参数的话,是()还是什么都不用,好久不用了
handsomerun 2005-12-30
  • 打赏
  • 举报
回复
偶也只会VB,
BCB,Delphi偶一点不懂

先说说VC++的编程。首先在VC++中生成Win32 DLL工程。在这个工程中添加几个函数供VB用户调用。一个DLL中的函数要想被VB调用,必须满足两个条件:一是调用方式为stdcall,另一个是必须是export的。要做到第一条,只须在函数声明前加上__stdcall关键字。如:
short __stdcall sample(short nLen, short *buffer)
要做到第二条,需要在*.def文件中加上如下的几行:
EXPORTS
sample @1
这里的sample是你要在VB中调用的函数名,@1表示该函数在DLL中的编号,每个函数都不一样。注意这里的函数名是区分大小写的。至于你说的需要传递大量数据,可以这样做,在VB中用一个数组存放数据,然后将该数组的大小和地址传给VC(至于如何在VB中编程我会在下面介绍)。就象上面的例子,nLen是数组大小,buffer是数组地址,有了这两条,你可以象使用VC的数组一样进行处理了。至于输出图形,可以生成WMF或BMP格式,让VB调用。不过,我认为也可以直接输出到视窗,只要VB将窗口的句柄hWnd和hDC以及视窗的绘图位置(VB和VC采用的坐标系必须一致才行)传给VC就行了。而VB的AutoRedraw属性必须为False,在Paint事件中调用VC的绘图程序。
再谈谈VB的编程。VB调用DLL的方法和调用Windows API的方法是一样的,一般在VB的书中有介绍。对于上面一个例子,先要声明VC函数:
Declare Function sample Lib "mydll.dll" (ByVal nLen As Integer, buffer As Integer) As Integer
这里mydll.dll是你的dll的名字。你可能已经注意到了两个参数的声明有所不同,第一个参数加上了ByVal。规则是这样的:如果在VC中某个参数声明为指针和数组,就不加ByVal,否则都要加上ByVal。在VB中调用这个函数采用这样的语法:
sample 10, a(0)
这里的a()数组是用来存放数据的,10为数组长度,这里的第二个参数不能是a(),而必须是要传递的数据中的第一个。这是VB编程的关键。
下面在说几个可能遇到的问题。一个问题是VB可能报告找不到dll,你可以把dll放到system目录下,并确保VB的Declare语句正确。另一个问题是VB报告找不到需要的函数,这通常是因为在VC中*.def文件没设置。第三种情况是VB告诉不能进行转换,这可能是在VC中没有加上__stdcall关键字,也可能是VB和VC的参数类型不一致,注意在VC中int是4个字节(相当于VB的Long),而VB的Integer只有2个字节。必须保证VB和VC的参数个数相同,所占字节数也一致。最后一个要注意的问题是VC中绝对不能出现数组越界的情况,否则会导致VB程序崩溃。


对于你的程序来说
Declare Function ReadRegComConfig Lib "xxx.dll" () As bool
pomelowu 2005-12-30
  • 打赏
  • 举报
回复
首先在VC++中生成Win32 DLL工程。在这个工程中添加几个函数供VB用户调用。一个DLL中的函数要想被VB调用,必须满足两个条件:一是调用方式为stdcall,另一个是必须是export的。要做到第一条,只须在函数声明前加上__stdcall关键字。如:
short __stdcall sample(short nLen, short *buffer)
要做到第二条,需要在*.def文件中加上如下的几行:
EXPORTS
sample @1
这里的sample是你要在VB中调用的函数名,@1表示该函数在DLL中的编号,每个函数都不一样。注意这里的函数名是区分大小写的。至于你说的需要传递大量数据,可以这样做,在VB中用一个数组存放数据,然后将该数组的大小和地址传给VC(至于如何在VB中编程我会在下面介绍)。就象上面的例子,nLen是数组大小,buffer是数组地址,有了这两条,你可以象使用VC的数组一样进行处理了。至于输出图形,可以生成WMF或BMP格式,让VB调用。不过,我认为也可以直接输出到视窗,只要VB将窗口的句柄hWnd和hDC以及视窗的绘图位置(VB和VC采用的坐标系必须一致才行)传给VC就行了。而VB的AutoRedraw属性必须为False,在Paint事件中调用VC的绘图程序。
再谈谈VB的编程。VB调用DLL的方法和调用Windows API的方法是一样的,一般在VB的书中有介绍。对于上面一个例子,先要声明VC函数:
Declare Function sample Lib "mydll.dll" (ByVal nLen As Integer, buffer As Integer) As Integer
这里mydll.dll是你的dll的名字。你可能已经注意到了两个参数的声明有所不同,第一个参数加上了ByVal。规则是这样的:如果在VC中某个参数声明为指针和数组,就不加ByVal,否则都要加上ByVal。在VB中调用这个函数采用这样的语法:
sample 10, a(0)
这里的a()数组是用来存放数据的,10为数组长度,这里的第二个参数不能是a(),而必须是要传递的数据中的第一个。这是VB编程的关键。
下面在说几个可能遇到的问题。一个问题是VB可能报告找不到dll,你可以把dll放到system目录下,并确保VB的Declare语句正确。另一个问题是VB报告找不到需要的函数,这通常是因为在VC中*.def文件没设置。第三种情况是VB告诉不能进行转换,这可能是在VC中没有加上__stdcall关键字,也可能是VB和VC的参数类型不一致,注意在VC中int是4个字节(相当于VB的Long),而VB的Integer只有2个字节。必须保证VB和VC的参数个数相同,所占字节数也一致。最后一个要注意的问题是VC中绝对不能出现数组越界的情况,否则会导致VB程序崩溃。


BCB应该和VC差不多吧

VC++和Delphi都支持Pascal和C语言两种调用协定。
如果使用Pascal协定,VC++的函数定义前要加_stdcall修饰(stdcall是Windows的标准调用方式,可以在所有支持API调用的语言中使用),并且需要在.DEF文件中的EXPORTS端中加入函数名。在Delphi定义时要在函数名后加stdcall修饰(参见帮助)。
如果使用C协定,VC++的函数定义前要加__declspec(dllexport)修饰,不需要再修改.DEF文件了。在Delphi定义时要在函数名后加cdecl修饰(参见帮助)。
pomelowu 2005-12-30
  • 打赏
  • 举报
回复
http://desktop.chinaitlab.com/C/36842.html

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧