急求VB对DLL调用的小例子 Private Declare Function Initial Lib "c:\123.dll" (ByVal HWND As HWND) As LongPrivate Sub Form_Load()Initial Me.HWNDEnd Sub 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Private Declare Function Initial Lib "c:\123.dll" (ByVal HWND As Long) As LongPrivate Sub Form_Load()Initial Me.HWNDEnd Sub 好像要用byref 我用VC开发了一个常规动态连接库.其中某输出函数的参数为char*:extern"C"__declspec(dllexport)voidOpenMyFile(char*strFile)在VB中我是如下用的:...PrivateDeclareFunctionOpenMyFileLib"Capturer.dll"(ByValstrFileAsString)AsLong...在打开文件按钮的事件中:DimsFileAsStringsFile="C:\\a.avi"OpenMyFilesFile//此语句报错!!!!!!!!!!!!!!!!!!!!!!!!!!1...大侠们help.注:我用VC调用该动态库无任何问题.---------------------------------------------------------------你vc要得到的是指向字符串的指针,所以申明的时候应该用ByRef。如下:PrivateDeclareFunctionOpenMyFileLib"Capturer.dll"(ByRefstrFileAsString)AsLong---------------------------------------------------------------指针类型声明的是要用BYREF(按地址传送)---------------------------------------------------------------控件数组的下标---------------------------------------------------------------VC中的输出函数应为__stdcall调用.---------------------------------------------------------------关键是函数导出约定楼上说的是对的_stdcall是Pascal程序的缺省调用方式,通常用于Win32Api中,函数采用从右到左的压栈方式,自己在退出时清空堆栈。VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上"@"和参数的字节数。2、C调用约定(即用__cdecl关键字说明)按从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于传送参数的内存栈是由调用者来维护的(正因为如此,实现可变参数的函数只能使用该调用约定)。另外,在函数名修饰约定方面也有所不同。VB只支持_stdcall现在知道了吗---------------------------------------------------------------PrivateSubCommand30_Click(IndexAsInteger)EndSub因为你定义了一个控件数组index为索引 这些代码是不是都是写在窗体文件内? (我今天见到VB里好像一般分模块和窗体两类文件)VB里可以用HWND类型吗? VB调用vc写的dll文件 各位大虾,我用VC写了一个DLL文件,里面有一个add函数,在调用的时候VB提示说找不到add在DLL文件中的入口点,请问这是怎么回事! --------------------------------------------------------------- 两个情况: 1. ActiveX DLL: regsvr32 cfile.dll 在VB中project->reference 然后创建对象,并调用其方法 2. 普通动态连接库 这就需要申明函数了,可以参考其它API申明的方式来做。 private declare function add lib "cfile" alias "add" (byval a as integer,byval b as integer) as integer --------------------------------------------------------------- 在VC里,函数名登记到.def文件里了没有?注意不是__declspec(dllexport)这个。 .def文件里一定要有: EXPORTS add @1 --------------------------------------------------------------- 自己定义也可以。 或者你用VC工程向导的“MFC AppWizard(dll)”->“Regular Dll with shared MFC”也就是第二项,这个就为你生成了.def。 用MFC的DLL要有MFC支持哦~设计接口参数时,可 别 来个“... Func(CWordArray &a)”这样的东东…… --------------------------------------------------------------- 主要是接口问题,我举个最简单的倒子给你: 一、在VC中建一个动态连接库工程取名XX,不要MFC支持 二、建一个C/C++文件,如XX.C,内容如下: SHORT SumTwo(SHORT a,SHORT b) { return a+b; } 三、建一个DEF文件,如XX.DEF,内容如下: EXPORTS SumTwo 四、将这两个文件都加入当前工程XX 五、将当前工程编译成XX.DLL 六、用VB来调用SumTwo这个函数,建新VB工程 七、在默认的FORM上加上一个按钮Command1 八、在Command1的OnClick中加入 MsgBox SumTwo(3,4) '显示3+4的值 九、将前面生成的XX.DLL复制到VB工程所在目录 十、在这个文件的最前面声明SumTwo这个函数 Private Function SumTwo Lib "XX.DLL" alias "SumTwo" (a As Integer,b As Integer) As Integer 十一、运行这个VB程,点击Command1按钮,你将得到3+4的和7 十二、关于第(十)步函数的声明请参看MSDN中的相关资料, 主要是参数和返回值的数据类型不能弄错。 --------------------------------------------------------------- 在VC中生成的DLL只有是扩展的DLL才能被其它语言调用,所以你在VC中生成的DLL可能不是扩展的,因此约定出错的,你把你VC的DLL改成扩展的就可以了。 i will try,thank you so much.嗯,空了还是该学学VB :) Declare Sub Initial Lib "你的DLL文件名" (ByVal HWND As Long) 急,我这里不知道为什么老是报"file not found?" 我实在不知道是哪里出了问题.可否给我一个编译通过顺利运行的实例,小小的就好?1.VC做的导出void Initial(HWND hWnd);的支持MFC的DLL(源工程)2.VB的单窗体,在Form_Load()里调用此DLL导出函数焦急等待... 文件名i'm sure 是一致的,相对路径/绝对路径都试过了,还是不行:( 请问关于vb用ado连接dbf数据库的问题 【问】如何加载内存中的Image.Picture给API版的ListView? VB中如何用dos的ftp命令上传下载文件? 使用VB多年,积累了一点经验,不敢私藏,与大家分享: 今天俺想辞职,就放50分吧.今晚五点前结贴! MSHFlexGrid的问题 有谁有智能一卡通的一些资料啊。10号前要啊! 问两个关于菜单的问题? 诚招急救员:MDI窗口如何实现背景图象的平铺效果? 送分啦!要分得过来.vb中操作长字符串(大于255字节的字符串如何操作) 怎么确认用vb登陆网页是否成功? 用VB调用可执行程序(比如C遍的)怎么得到返回值?
Initial Me.HWND
End Sub
其中某输出函数的参数为char*:
extern"C"__declspec(dllexport)voidOpenMyFile(char*strFile)在VB中我是如下用的:
...
PrivateDeclareFunctionOpenMyFileLib"Capturer.dll"(ByValstrFileAsString)AsLong
...在打开文件按钮的事件中:
DimsFileAsString
sFile="C:\\a.avi"
OpenMyFilesFile//此语句报错!!!!!!!!!!!!!!!!!!!!!!!!!!1
...大侠们help.注:我用VC调用该动态库无任何问题.
---------------------------------------------------------------你vc要得到的是指向字符串的指针,所以申明的时候应该用ByRef。如下:
PrivateDeclareFunctionOpenMyFileLib"Capturer.dll"(ByRefstrFileAsString)AsLong
---------------------------------------------------------------指针类型声明的是要用BYREF(按地址传送)---------------------------------------------------------------控件数组的下标
---------------------------------------------------------------VC中的输出函数应为__stdcall调用.
---------------------------------------------------------------关键是函数导出约定楼上说的是对的_stdcall是Pascal程序的缺省调用方式,通常用于Win32Api中,函数采用从右到左的压栈方式,自己在退出时清空堆栈。VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上"@"和参数的字节数。2、C调用约定(即用__cdecl关键字说明)按从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于传送参数的内存栈是由调用者来维护的(正因为如此,实现可变参数的函数只能使用该调用约定)。另外,在函数名修饰约定方面也有所不同。VB只支持_stdcall现在知道了吗---------------------------------------------------------------PrivateSubCommand30_Click(IndexAsInteger)EndSub
因为你定义了一个控件数组index为索引
---------------------------------------------------------------
两个情况:
1. ActiveX DLL:
regsvr32 cfile.dll
在VB中project->reference
然后创建对象,并调用其方法
2. 普通动态连接库
这就需要申明函数了,可以参考其它API申明的方式来做。
private declare function add lib "cfile" alias "add" (byval a as integer,byval b as integer) as integer
---------------------------------------------------------------
在VC里,函数名登记到.def文件里了没有?注意不是__declspec(dllexport)这个。
.def文件里一定要有:
EXPORTS
add @1
---------------------------------------------------------------
自己定义也可以。
或者你用VC工程向导的“MFC AppWizard(dll)”->“Regular Dll with shared MFC”也就是第二项,这个就为你生成了.def。
用MFC的DLL要有MFC支持哦~设计接口参数时,可 别 来个“... Func(CWordArray &a)”这样的东东……
---------------------------------------------------------------
主要是接口问题,我举个最简单的倒子给你:
一、在VC中建一个动态连接库工程取名XX,不要MFC支持
二、建一个C/C++文件,如XX.C,内容如下:
SHORT SumTwo(SHORT a,SHORT b)
{
return a+b;
}
三、建一个DEF文件,如XX.DEF,内容如下:
EXPORTS
SumTwo
四、将这两个文件都加入当前工程XX
五、将当前工程编译成XX.DLL
六、用VB来调用SumTwo这个函数,建新VB工程
七、在默认的FORM上加上一个按钮Command1
八、在Command1的OnClick中加入
MsgBox SumTwo(3,4) '显示3+4的值
九、将前面生成的XX.DLL复制到VB工程所在目录
十、在这个文件的最前面声明SumTwo这个函数
Private Function SumTwo Lib "XX.DLL" alias "SumTwo" (a As Integer,b As Integer) As Integer
十一、运行这个VB程,点击Command1按钮,你将得到3+4的和7
十二、关于第(十)步函数的声明请参看MSDN中的相关资料,
主要是参数和返回值的数据类型不能弄错。
---------------------------------------------------------------
在VC中生成的DLL只有是扩展的DLL才能被其它语言调用,所以你在VC中生成的DLL可能不是扩展的,因此约定出错的,你把你VC的DLL改成扩展的就可以了。
嗯,空了还是该学学VB :)
可否给我一个编译通过顺利运行的实例,小小的就好?
1.VC做的导出void Initial(HWND hWnd);的支持MFC的DLL(源工程)
2.VB的单窗体,在Form_Load()里调用此DLL导出函数焦急等待...