在调用中使用structs从vb.net中执行pinvoke
pinvoke from vb.net using structs in call
我真的很难处理下面的pinvoke调用。我尝试了很多不同的方法,但仍然没有快乐。
调用一直运行,但我收到了一条"Bad parameter"消息,表明结构有问题,因为我已经运行了该代码的c++示例,并且参数都是正确的。
如果有任何帮助,我会非常感激的,我已经在谷歌上疯了!
在c++头文件中:
int __stdcall DVSNET_OpenChannel(HANDLE hServer,unsigned long nChannel,DVSNET_CHANNEL_INFO *pChannelInfo,HANDLE *phChannel);
typedef struct tagDVSNET_CHANNEL_INFO
{
unsigned long lStructSize;
unsigned long dwStreamNo;
unsigned long nProtocol;
HWND hWndDisplay;
unsigned long bPlayStart;
unsigned long dwBackFrameCount;
unsigned long dwFlag;
} DVSNET_CHANNEL_INFO;
我对导入的定义:
<DllImport("DVSNETClient.dll")> _
Public Shared Function DVSNET_OpenChannel(ByVal hServer As System.IntPtr, ByVal nChannel As UInteger, ByRef pChannelInfo As IntPtr, ByRef phChannel As IntPtr) As Integer
End Function
<StructLayout(LayoutKind.Sequential)> _
Public Structure tagDVSNET_CHANNEL_INFO
Public lStructSize As UInteger
Public dwStreamNo As UInteger
Public nProtocol As UInteger
Public hWndDisplay As IntPtr
Public bPlayStart As UInteger
Public dwBackFrameCount As UInteger
Public dwFlag As UInteger
End Structure
我的呼叫代码:
Private Sub OpenChannel()
Dim intRet As Integer
Dim ChannelInfo As New tagDVSNET_CHANNEL_INFO
Dim HWD As New System.IntPtr
ChannelInfo.lStructSize = System.Runtime.InteropServices.Marshal.SizeOf(ChannelInfo)
ChannelInfo.nProtocol = 0
ChannelInfo.dwStreamNo = 0
ChannelInfo.dwBackFrameCount = 10
ChannelInfo.hWndDisplay = HWD
ChannelInfo.bPlayStart = 0 ' dont display
'Channelinfo.dwFlag =
' Initialize unmanged memory to hold the struct.
Dim ptr As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(ChannelInfo))
System.Runtime.InteropServices.Marshal.StructureToPtr(ChannelInfo, ptr, True)
Dim nChannel As UInteger = 1
intRet = TotemPoleLib.DVSNET_OpenChannel(hServer, nChannel, ptr, hChannel)
'... snip ...
End Sub
非常感谢!
我不知道VB.Net语法,但如果你理解C#,那么下面是DVSNET_CHANNEL_INFO
和DVSNET_OpenChannel
:的正确p/Invoke声明
[StructLayout(LayoutKind.Sequential)]
struct DVSNET_CHANNEL_INFO
{
uint lStructSize;
uint dwStreamNo;
uint nProtocol;
IntPtr hWndDisplay;
uint bPlayStart;
uint dwBackFrameCount;
uint dwFlag;
}
static class DVSNETClient
{
[DllImport("DVSNETClient.dll")]
public static extern int DVSNET_OpenChannel(
IntPtr hServer,
uint nChannel,
ref DVSNET_CHANNEL_INFO pChannelInfo,
ref IntPtr phChannel
);
}
您的DVSNET_CHANNEL_INFO
看起来不错,但DVSNET_OpenChannel
的第三个自变量应该只是ref DVSNET_CHANNEL_INFO
;所有封送处理都是自动完成的,这里不需要Marshal
类。您只需要在调用DVSNET_OpenChannel
之前将ChannelInfo.lStructSize
初始化为Marshal.SizeOf(typeof(DVSNET_CHANNEL_INFO))
的值。在DVSNET_CHANNEL_INFO
的非默认构造函数中这样做可能是明智的,但考虑到它是一个结构,当然没有办法强制使用该构造函数而不是隐式默认构造函数。
注意,从语义上讲,pChannelInfo
和/或phChannel
可能是out
而不是ref
,但不可能通过DVSNET_OpenChannel
的签名来判断。在任何情况下,使用ref
都会起作用,尽管如果确实需要out
,它的效率将低于使用out
。
相关文章:
- 如何在 64 位 vb.net Windows 应用程序中引用 32 位 dll
- 如何将 VB.Net 字符串作为字符*传递给C++dll?
- VB.NET DLL中的C++DLL函数复制
- TEA在VB.NET中的实现
- 如何使函数返回数组?用于制作在VB.NET中使用的DLL
- 反调试器技术:如何使用 VB.NET 对调试器隐藏线程?
- 如何在C 调用的VB.NET中编写回调函数
- 我可以在 vb.net Windows 窗体应用程序中使用 COLECONTROLModule 吗?
- C++ DLL 包装器 vb.net 传递字节数组的字节数组?
- 将简单的程序从C++移植到 vb.net
- 内存损坏从vb.net调用c dll
- vb.net单不等于c float
- 导入C 功能将结构的指针返回到VB.NET中
- REGDB_E_CLASSNOTREG from VB.NET to C++
- 使用来自VB.NET的参数调用C 函数
- 使用P/Invoke从MFC DLL函数中读取VB.NET中的结构化数据
- 将 C 按位语句转换为 vb.net
- C++ dll variable to vb.net exe
- 我无法读取 mft 并将 VB.net 转换为 C
- 在vb.net中调用C DLL文件