VB6调用VC2015的DLL

chinayu2007 2018-01-20 09:18:26
我用VC2015编写了一个DLL,导出了函数.在其他语言中调用没有问题(如delphi7),但是在VB6中的有点问题,需要传入一个字符串参数,传入不成功.
DLL中的声明如下:
extern "C" __declspec(dllexport) void __stdcall Create(char * str,int a,int b)
{
}
在VB中声明如下:
Private Declare Function Create Lib "my.dll" (ByVal strType As String,ByVal a As Integer,ByVal B As Integer )

DLL中还包含其他几个函数,如果是传入整数作为参数的函数,都可以成功调用.有字符串参数,就传不进去,字符串指针收到是空值,而且参数a的值给了b,b参数丢失.
...全文
831 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
海鸥软件 2018-03-08
  • 打赏
  • 举报
回复
vb 和c的字符串在内存保存形式不一样
舉杯邀明月 2018-01-24
  • 打赏
  • 举报
回复
呵呵,楼上的把那个API的第1个参数声明为“ByVal strType As Byte”,能正确传递参数才是怪事了……
赵4老师 2018-01-23
  • 打赏
  • 举报
回复
of123 2018-01-23
  • 打赏
  • 举报
回复
Private Declare Sub Create Lib "my.dll" (ByVal strType As Byte, ByVal a As Long, ByVal B As Long ) 调用时: Dim tmp(255) As Byte tmp = StrConv(strType, vbFromUnicode) Create(tmp(0), a, b)
chinayu2007 2018-01-20
  • 打赏
  • 举报
回复
谢谢楼上的高手,在VB的声明后面加一个返回值,调用就正常.而DLL里什么也没改.如下: Private Declare Function Create Lib "my.dll" (ByVal strType As String,ByVal a As Integer,ByVal B As Integer ) as Boolean 后面加了一个返回值声明,随便的类型,DLL中没有加,没有任何改动
舉杯邀明月 2018-01-20
  • 打赏
  • 举报
回复
VC2015的int,是“32位”的吧!VB6中应该声明为 Long类型。 (不过我觉得Integer也应该不影响啊,只是“值域”变小了而已) 那个char * str参数,你在VB6中声明为“ByVal strType As String”肯定有问题,  应该“引用传递”,把ByVal去掉。 另外,你可以改变一下声明形式,不过你使用起来麻烦点(但用这种方式能更灵活): Private Declare Function Create Lib "my.dll" (ByVal strType As Long, ByVal A As Long, ByVal B As Long) 使用: dim arrData() as byte arrData() = StrConv("ABCD123", vbFromUnicode) Call Create(VarPtr(arrdata(0)), 1, 2)
m0_37726208 2018-01-20
  • 打赏
  • 举报
回复
有可能和vc2015有关吧,以前用C++builder6写的dll,是不需要这样的
舉杯邀明月 2018-01-20
  • 打赏
  • 举报
回复
有这么怪的事………… 按理说,“void __stdcall”就是无返回值的函数(VB6中叫“Sub”),并且stdcall的,VB6就可以“正常使用”。 另外,无论“API”是否有返回值,在VB6中声明为Function或Sub,在“调用”时,都不会对“参数传递”产生影响啊…………

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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