高分求解关于VB调用C写的Dll问题
头让做一个工程。对方给了个API和用C调用的例子如下:
int base64enc(unsigned char *src, int srcLen, char **dst, int *dstLen)
参数说明:
src源数据,其长度为:srcLen;
dst为编码后的数据,长度存放在:dstLen。dst的存储空间由接口申请,应用释放
返回:0正确,-1错误
我对C不熟,就在VB里尝试着调用:
Private Declare Function base64enc Lib "C:\test\certinfo.dll" (ByRef src() As Byte, ByVal srcLen As Integer, ByRef dst() As Byte, ByVal dstLen As Integer) As Integer
Private Sub Command1_Click()
Dim m_src() As Byte
Dim m_srcLen As Integer
Dim m_dst() As Byte
Dim m_dstLen As Integer
aa = base64enc(m_src, m_srcLen, m_dst, m_dstLen)
End Sub
结果运行提示找不到入口,请问错在那里了?
我一回只能给100,但这个给500,分次给,绝不食言。
问题点数:100、回复次数:24Top
1 楼sunshinecom21(用VB)回复于 2002-04-16 16:23:46 得分 0
试试右击“工具箱”——设定使用元件——弹出调用外部控件对话框
点击"浏览"——找到你所需要的dll控件,就应该可以在VB中直接使用了Top
2 楼rushing(勇敢的心)回复于 2002-04-16 16:28:24 得分 0
在“工程”的引用和部件中也可以。
Top
3 楼djboy(小戴)回复于 2002-04-16 16:30:10 得分 0
确认包含了所需的所有控件吗?Top
4 楼feiying_bao(飞鹰)回复于 2002-04-16 16:31:24 得分 10
int base64enc(unsigned char *src, int srcLen, char *dst, int *dstLen)
Private Declare Function base64enc Lib "C:\test\certinfo.dll" (ByRef src() As Byte, ByVal srcLen As Integer, ByRef dst() As Byte, ByVal dstLen As Integer) As Integer
int *dstLen是指针,ByVal dstLen As Integer应该改为ByRef dstLen As Integer
Top
5 楼txs()回复于 2002-04-16 16:32:55 得分 80
Private Declare Function base64enc Lib "C:\test\certinfo.dll" (src As Byte, ByVal srcLen As Integer, dst As Byte, ByVal dstLen As Integer) As Integer
Private Sub Command1_Click()
Dim m_src() As Byte
Dim m_srcLen As Integer
Dim m_dst() As Byte
Dim m_dstLen As Integer
'2个数组必须定义长度,预先分配空间,这里举个例子100
redim m_src(100) ,m_dst(100)
aa = base64enc(m_src(0), m_srcLen, m_dst(0), m_dstLen)
'在VB中缺省的参数调用是传址。所以把m_dst(0) 传过去就是把该数组的第一个地址传过去了。
End Sub
Top
6 楼yokel(SOD)回复于 2002-04-16 16:32:56 得分 0
同意楼上的Top
7 楼txs()回复于 2002-04-16 16:37:42 得分 0
Private Declare Function base64enc Lib "C:\test\certinfo.dll" (src As Byte, ByVal srcLen As Integer, dst As Byte, dstLen As Integer) As Integer
上面定义写错了
BTW:“char **dst”是不是你写错了?怎么会是指针的指针?Top
8 楼cuiyxy(Passerby_001)回复于 2002-04-16 16:44:57 得分 10
我曾经做过的一个程序
VC++
extern "C" __declspec(dllexport) long __stdcall GetSN(char *SNp,short SNBufLen );
VB
Public Declare Function GetSN Lib "BudgCalc.DLL" Alias "_GetSN@8" (ByVal Bf As String, ByVal BfLen As Integer) As Long
注意函数名变化(VC)GetSN --> (VB) _GetSN@8
函数名称变化规则我不清楚,但可以通过
D:\Program Files\Microsoft Visual Studio\Common\Tools\DEPENDS.EXE
查看
Top
9 楼zt371(dudu)回复于 2002-04-16 16:45:31 得分 0
这么快就有这么多人了,谢谢大家。
先谢谢飞鹰的提示。我改过了。
txs() ,我按照你的方法试验了。但是当用m_src(0),m_dst(0)的时候提示数组获用户定义类型。去掉地址0的时候又提示找不到入口。
对于文档应该不错,我从Word直接粘贴来的。Top
10 楼txs()回复于 2002-04-16 16:51:36 得分 0
等一下,上面的还有点问题。CSDN的BBS怎么不能修改的,FAINTTop
11 楼load(不是东西)回复于 2002-04-16 17:22:14 得分 0
传入参数一定要用数组的第一个值,看看这样会报错不?
Private Declare Function base64enc Lib "C:\test\certinfo.dll" (ByRef src As Byte, ByVal srcLen As Integer, ByRef dst As Byte, Byref dstLen As Integer) As Integer
Private Sub Command1_Click()
Dim m_src(100) As Byte
Dim m_srcLen As Integer
Dim m_dst(100) As Byte
Dim m_dstLen(100) As Integer
aa = base64enc(m_src(0), m_srcLen(0), m_dst, m_dstLen(0))
End Sub
Top
12 楼txs()回复于 2002-04-16 17:28:09 得分 0
int base64enc(unsigned char *src, int srcLen, char **dst, int *dstLen)
参数说明:
src源数据,其长度为:srcLen;
dst为编码后的数据,长度存放在:dstLen。dst的存储空间由接口申请,应用释放
返回:0正确,-1错误
Private Declare Function base64enc Lib "C:\test\certinfo.dll" (src As Byte, ByVal srcLen As Integer, dst As any, ByVal dstLen As Integer) As Integer
Public Declare Sub RtlMoveMemory Lib "kernel32" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
Private Sub Command1_Click()
Dim m_src() As Byte
Dim m_srcLen As Integer
Dim m_dst() as byte
Dim m_dstLen As Integer
dim p_dst
'数组必须定义长度,预先分配空间.
redim m_src(m_srcLen)
aa = base64enc(m_src(0), m_srcLen, p_dst, m_dstLen)
redim m_dst(m_dstlen)
'在VB中缺省的参数调用是传址。所以把m_src(0) 传过去就是把该数组的第一个地址传过去了。
'p_dst得到m_dst指针
RtlMoveMemory m_dst(0), byval p_dst, m_dstlen
'将数据COPY出来
End Sub
这回应该差不多了。
CSDN怎么不能修改帖子?Top
13 楼txs()回复于 2002-04-16 17:30:41 得分 0
KAO,又错了 :)
赶着吃饭。
int base64enc(unsigned char *src, int srcLen, char **dst, int *dstLen)
参数说明:
src源数据,其长度为:srcLen;
dst为编码后的数据,长度存放在:dstLen。dst的存储空间由接口申请,应用释放
返回:0正确,-1错误
Private Declare Function base64enc Lib "C:\test\certinfo.dll" (src As Byte, ByVal srcLen As Integer, dst As any, dstLen As Integer) As Integer
Public Declare Sub RtlMoveMemory Lib "kernel32" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
Private Sub Command1_Click()
Dim m_src() As Byte
Dim m_srcLen As Integer
Dim m_dst() as byte
Dim m_dstLen As Integer
dim p_dst
'数组必须定义长度,预先分配空间.
redim m_src(m_srcLen)
aa = base64enc(m_src(0), m_srcLen, p_dst, m_dstLen)
redim m_dst(m_dstlen)
'在VB中缺省的参数调用是传址。所以把m_src(0) 传过去就是把该数组的第一个地址传过去了。
'p_dst得到m_dst指针
RtlMoveMemory m_dst(0), byval p_dst, m_dstlen
'将数据COPY出来
End Sub
Top
14 楼zt371(dudu)回复于 2002-04-16 17:35:21 得分 0
再次感谢txs() 。
我又试了,还是不行。报错还是:
找不到入口。:(Top
15 楼txs()回复于 2002-04-16 17:50:14 得分 0
你是用下面那个“赶着吃饭”的帖子里面的程序试的?Top
16 楼txs()回复于 2002-04-16 18:25:41 得分 0
或者这样 ,改2句
1)
Private Declare Function base64enc Lib "C:\test\certinfo.dll" (src As Byte, ByVal srcLen As Integer, dst As long, dstLen As Integer) As Integer
2)
dim p_dst as long
给它指定,反正指针就是LONGTop
17 楼zt371(dudu)回复于 2002-04-16 18:39:40 得分 0
谢谢了。还是不行。我开始怀疑对方提供的API有问题了:)
回头我再试试。Top
18 楼coowoo(coowoo)回复于 2002-04-16 18:51:45 得分 0
int base64enc(unsigned char *src, int srcLen, char **dst, int *dstLen)
vc里的int也是32 位的
Private Declare Function base64enc Lib "C:\test\certinfo.dll" (byref src As any, ByVal srcLen As long,byref dst As any,byref dstLen As long) As long
调用的时候dst应定义为longTop
19 楼Mailbomb(网络咖啡http://blog.csdn.net/mailbomb)回复于 2002-04-16 18:56:17 得分 0
学习Top
20 楼txs()回复于 2002-04-16 19:11:27 得分 0
要不把DLL传过来让我试试?
我估计就是那几个参数类型的问题。
或者DLL定义DST用ANY,下面p_dst 用LONG?
Top
21 楼ltpao(啊炮)回复于 2002-04-16 19:16:40 得分 0
C中int型对应VB中的long型
Private Declare Function base64enc Lib "C:\test\certinfo.dll" (byref src As byte, ByVal srcLen As long,byref dst As byte,byref dstLen As long) As long
Top
22 楼txs()回复于 2002-04-16 19:17:36 得分 0
对,VC的INT是LONG :)Top
23 楼txs()回复于 2002-04-16 19:18:52 得分 0
WORD才是VB的INTEGERTop
24 楼zt371(dudu)回复于 2002-04-18 07:54:30 得分 0
没人了吗?UP一下Top
25 楼txs()回复于 2002-04-18 16:36:09 得分 0
Private Declare Function base64enc Lib "C:\test\certinfo.dll" (src As Byte, ByVal srcLen As long, dst As byte, dstLen As long) As Integer
Public Declare Sub RtlMoveMemory Lib "kernel32" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
Private Sub Command1_Click()
Dim m_src() As Byte
Dim m_srcLen As Integer
Dim m_dst() as byte
Dim m_dstLen As Integer
dim p_tmp_dst(16) as byte
dim p_dst(4) as long
redim m_src(m_srcLen)
aa = base64enc(m_src(0), m_srcLen, p_tmp_dst(0), m_dstLen)
RtlMoveMemory p_dst(0),p_tmp_dst,4
'忘了最后的长度定义是看哪个参数的(前面的类型还是后面的类型长度?),多COPY一点应该没有关系,你试验确认后可以再改回去,下面也是如此 :)
redim m_dst(m_dstlen*4)
RtlMoveMemory m_dst(0), byval p_dst(0), m_dstlen
'将数据COPY出来
End Sub
Top
26 楼txs()回复于 2002-04-18 16:38:32 得分 0
应该没有问题了。有没有问题都告诉我一声,指针的指针确实比较烦,Top




