请教:VB.NET调用dll和VB调用dll的问题

testpwd 2010-05-14 09:51:16
我在VC中写了一个导出函数:

extern "C" __declspec(dllexport)
HRESULT Init(LPCSTR lpcsParam = NULL)
{
...
}

在VB.NET 中:

Imports System.Runtime.InteropServices

<DllImport("example.dll", CallingConvention:=CallingConvention.Cdecl)> _
Public Function Init(ByVal lpcsParam As String) As Integer
End Function

调用Init可以成功。

在VB6.0中:

Private Declare Function Init Lib "example.dll" (ByVal lpcsParam As String) As Integer

但在调用时报“DLL 调用约定错误”。

请问VC中导出函数的声明是否有问题呢?
...全文
185 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
testpwd 2010-05-19
  • 打赏
  • 举报
回复
多谢xingyuebuyu和zdbb的热情帮助。
只在此山中 2010-05-15
  • 打赏
  • 举报
回复
vb6无法调用Cdecl方式的dll.
你用vc修改dll源码为stdcall,重新编译;
如果没有该dll的源码,用vc建个新dll,写同样的函数,功能是转换旧dll的cdecl为stdcall方式,
这样vb6调用时需要新旧2个dll文件,声明新dll的函数即可.
testpwd 2010-05-14
  • 打赏
  • 举报
回复
请牛人指教啊

刚才又把函数瞎改了下:

extern "C" __declspec(dllexport)
HRESULT __stdcall Init(LPCSTR lpcsParam = NULL)
{
...
}

编译后,用depends工具查看,里面的导出函数名称变成了_Init@4

(原来是Init)

于是VB程序里面就找不到Init了,改成_Init@4也不附合VB的语法,编译报错。
testpwd 2010-05-14
  • 打赏
  • 举报
回复
改成Long试了的,也是报一样的错。
oo渣渣oo 2010-05-14
  • 打赏
  • 举报
回复
Private Declare Function Init Lib "example.dll" (ByVal lpcsParam As String) As Long
Forrest23 2010-05-14
  • 打赏
  • 举报
回复

Private Declare Function Init Lib "example.dll" (ByVal lpcsParam As String) As Long
hztltgg 2010-05-14
  • 打赏
  • 举报
回复
vb6.0的integer只有16位,应该用long类型,不确定,试试看吧,字符串类型可能也不一样
xingyuebuyu 2010-05-14
  • 打赏
  • 举报
回复
http://www.hongen.com/pc/program/apitutor/api/api02.htm

 Private Declare Function Init Lib "example.dll" Alias "_Init@4" (ByVal lpcsParam As String) As Long


VB6.0好像调用不了Cdecl方式的DLL,都是调用__stdcall的

16,555

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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