CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  基础类

高分求解关于VB调用C写的Dll问题

楼主zt371(dudu)2002-04-16 16:15:55 在 VB / 基础类 提问

头让做一个工程。对方给了个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

相关问题

  • vb调用C写的DLL
  • C#中调用外部命令行程序新问题求解
  • 100分求解:PB6.5下如何调用VB开发的DLL。
  • 在C++中如何调用用C写的函数?在线求解,急!!!
  • 求解:在C++Builder中怎样调用PB中的存储过程?
  • 100分求解:在c#中调用Oracle包时出错,具体如下?
  • 高人求解:C#里调用VC组件,它们之间交互问题
  • VB中能调用C#写的DLL吗?
  • 如何用vb。net调用c#函数???
  • C# 编译dll VB调用 可以吗

关键词

  • 指针
  • vb
  • 数据
  • dstlen
  • srclen
  • dst
  • bytedim
  • integerdim
  • certinfo
  • 调用

得分解答快速导航

  • 帖主:zt371
  • feiying_bao
  • txs
  • cuiyxy

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo