我正在尝试为我公司使用的设备导入驱动程序DLL,但我似乎无法让它工作。我是c#的新手,所以请放轻松我。这与我昨天发布的帖子有关,我试图将C程序转换为C#。
我编写了这段代码,以便我可以开始理解PInvoke
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace PInvokeTest {
class Program {
static void Main(string[] args) {
Int32 session_handle = 0;
Byte state_buffer = 0;
Int16 result = 1, PortNum = 1, PortType = 1;
session_handle = TMExtendedStartSession(PortNum, PortType);
result = TMSearch(session_handle, state_buffer, 1, 1, 0xEC);
if (result == 1)
Console.WriteLine("Device Found");
if (result == -201)
Console.WriteLine("Hardware Driver Not Found");
else
Console.WriteLine("Network Error");
Console.ReadKey();
}
[DllImport("IBFS32.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
public static extern Int32 TMExtendedStartSession(Int16 PortNum, Int16 PortType);
[DllImport("IBFS32.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
public static extern Int16 TMSearch(Int32 session_handle, Byte state_buffer, int p1, int p2, int p3);
}
}
我正在尝试使用这两个功能
TMExthendedStartSession http://files.maximintegrated.com/sia_bu/licensed/docs/1-wire_sdk_win/TMEX/exst8l9q.html
和TMSearch http://files.maximintegrated.com/sia_bu/licensed/docs/1-wire_sdk_win/TMEX/sear1ezy.html
当我运行TMExthendedStartSession时,我得到System.AccessViolationException,但是当我单独运行TMSearch时,我收到一条消息 " 托管调试助手' PInvokeStackImbalance'已在C:\ PInvokeTest \ Debug \ PInvokeTest.vshost.exe' 中检测到问题。"
函数TMSearch确实返回值-201。
感谢任何帮助。
答案 0 :(得分:1)
在32位Windows中,pascal调用约定映射到stdcall。 #define
(或更现代的SDK中的WinDef.h
)顶部附近有一个minwindef.h
,可将pascal
映射到__stdcall
。
最重要的是,你的参数都错了。它应该是这样的:
[DllImport("IBFS32.dll")]
public static extern int TMExtendedStartSession(
short PortNum,
short PortType,
IntPtr EnhancedOptions
);
[DllImport("IBFS32.dll")]
public static extern short TMSearch(
int session_handle,
IntPtr state_buffer,
short p1,
short p2,
short p3
);
state_buffer
参数可能更好地声明为byte[]
。从这里很难说出语义是什么。