C 与VB接品API

PP_Sky 2008-11-18 10:47:03
我写了一个C的DLL,函数定义如下
extern "C" DWORD __declspec(dllexport) XPP( LPSTR pszDeviceName, int x, int y, int barcode_height, LPCSTR pszLabel)

在VB中调用,引用为
Private Declare Function XPP Lib "XDLL.dll" ( _
ByVal pszDeviceName As String, ByVal X As Long, ByVal Y As Long, _
ByVal height As Long, ByVal pszLabel As String) As Long

调用时,出现"DLL调用约定出错"

请问各位高手,有没有哪写错了?
...全文
105 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Cauly123 2008-11-19
  • 打赏
  • 举报
回复
555我明明也提到了stdCall的问题-_-
Cauly123 2008-11-19
  • 打赏
  • 举报
回复
我晕啊
这个问题我也遇到过,最后无疾而终,反正成品能用
VB的字符串传到VC好像没什么问题,只是好像……传递到c就肯定有问题了,但是这个问题在传递中不会出现DLL调用约定出错,因为传递的肯定是指针,里面的内容和它没有关系
PP_Sky 2008-11-19
  • 打赏
  • 举报
回复
to no1gentlebreeze:
试了,还是一样

问题是我的代码,只要不是调试的就可以正常运行。而且结果正确。
一在VB中调试,就出这个错,但DLL的调用是正确的.......


是不是VB的字符串传到VC有什么问题呢?
Cauly123 2008-11-19
  • 打赏
  • 举报
回复
ByVal XX As String的,都改成Byval XX as Long试试 因为所有api参数都可以这么声明
还有我记得好像在我看到过的C声明中好像都有stdCall字样具体不知道楼主参考下
另外看看.def文件里有没有出错……
我只用汇编做过dll给vb用过……所以经验还不足 只能想到这些
PP_Sky 2008-11-19
  • 打赏
  • 举报
回复
搞掂了,谢谢楼上两位。

extern "C" 不是 __stdcall...

哈哈
PP_Sky 2008-11-19
  • 打赏
  • 举报
回复
__declspec(dllexport) 是dll导出,与约定无关, extern "C" 就是 __stdcall了。

我的问题是:这个函数,在VB编译成.EXE时可以调用正确。
不过在VB的debug时,老说约定不对。
of123 2008-11-19
  • 打赏
  • 举报
回复

6 楼正解。用 __stdcall 替换 __declspec。VB 不能直接支持 __declspec 调用约定。

否则,就必须在模块中做一个类,如下例:

Imports System
Imports Microsoft.VisualBasic
Imports System.Runtime.InteropServices
Public Class LibWrap
' Visual Basic does not support varargs, so all arguments must be
' explicitly defined. CallingConvention.Cdecl must be used since the stack
' is cleaned up by the caller.
' int printf( const char *format [, argument]... )
<DllImport("msvcrt.dll", CallingConvention := CallingConvention.Cdecl)> _
Overloads Shared Function printf ( _
format As String, i As Integer, d As Double) As Integer
End Function
<DllImport("msvcrt.dll", CallingConvention := CallingConvention.Cdecl)> _
Overloads Shared Function printf ( _
format As String, i As Integer, s As String) As Integer
End Function
End Class 'LibWrap
Public Class App
Public Shared Sub Main()
LibWrap.printf(ControlChars.CrLf + "Print params: %i %f", 99,
99.99)
LibWrap.printf(ControlChars.CrLf + "Print params: %i %s", 99, _
"abcd")
End Sub 'Main
End Class 'App
supergreenbean 2008-11-19
  • 打赏
  • 举报
回复
你的C函数并非使用__stdcall调用约定,你改下你C函数声明,加上__stdcall即可
PP_Sky 2008-11-18
  • 打赏
  • 举报
回复
to SYSSZ:
我写的是extern "C"的API,不是COM。没有DllRegister入口可以注册,谢谢。
SYSSZ 2008-11-18
  • 打赏
  • 举报
回复
如果你用C写了Dll,引入VB的常用方法是:
工程---引用---浏览---找到你那个dll--确定,如果这时你的Dll出现在引用对话框,对象浏览器有相应的类名,则引用成功,这时按使用类的方法使用就行了.

1,488

社区成员

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

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