【发布时间】:2021-04-21 11:41:39
【问题描述】:
我需要从 VB.NET 项目调用位于 C++ dll 中的函数。
C++ dll文档中的定义是:
HRESULT GetStatus(LPBYTE lpSize, LPBYTE lpStatus, HWND hWnd = 0)
lpSize数据:lpStatus的大小lpStatus:指定一个区域的指针来存储设备状态。
存储状态和以下数据。
存储数据需要 255 字节空间
我这样声明函数
<DllImport("cplusplusdll.dll", CharSet:=CharSet.Ansi, CallingConvention:=CallingConvention.StdCall, EntryPoint:="GetStatus")>
Public Function GetStatus(ByVal lpSize As String, ByRef lpStatus As String, ByVal hwnd As Long) As Integer
End Function
我这样称呼它:
Dim status As String
result = GetStatus("255", status, 0)
但是当我打电话时,我收到关于 pinvoikeStackImbalance 的错误,pinvoke 签名不匹配...似乎定义不正确...
我尝试了很多组合,但都没有成功。任何帮助将不胜感激。
提前致谢。
【问题讨论】:
-
LPBYTE是一个指向BYTE的指针,所以这些是IntPtr()并对其进行编组 (Marshal.Copy())。你知道尺寸吗? -
如果
LPBYTE确实意味着代表LPSTR,就像它可以从您的用法中理解的那样,并且如果第二个参数应该接收一个字符串,然后GetStatus(ByVal lpSize As String, ByVal lpStatus As StringBuilder, ByVal hwnd As IntPtr) As Integer。我严重怀疑第一个参数,看起来像缓冲区的大小,是一个字符串。如果它确实是一个LPBYTE开头,那么它可能是你应该传递一个指向 int 而不是它的字符串表示形式的指针。 -
我已经用函数信息更新了帖子
-
jimi,谢谢你的回复。大小为 255
-
信息不足。第一个参数应该指向什么,某种整数或字符串缓冲区?该函数是否通过第一个参数返回实际长度,如果是,如何 - 作为缓冲区中的整数或作为缓冲区中的文本表示?如果需要 255 个字节,为什么首先要有第一个参数?
标签: c# c++ vb.net dll dllimport