我有一个COM接口dll,以及有关dll中方法的一些文档,但是根据我从文档中可以看出,该方法需要将自定义struct
作为{传递{1}}参数,但文档未提供有关out
本身的任何信息。
我从c#调用的函数如下:
API
struct
我的问题是UINT OpenRequest ([out] PHCOMS phComs,
[in] PCHAR pEndPointName,
[in] UINT fBlockingMode,
[in] UINT fOpenMode,
[in] UINT fDataType,
[in] HINSTANCE hInstance)
是文档中描述的类型:
HCOMS类型的变量的地址。其他API调用使用的通信句柄在此变量中返回。如果发生错误,则为NULL。
此函数首先分配一个通信句柄(hComs),如果 可用于应用程序。此句柄用于创建新句柄 连接对象。该功能的参数分配给 相关成员。对于此对象,将为其创建指针实例 连接到界面,以及PC Headerpched 接口
我已经看过各种dll检查员和SO上的其他帖子,但是找不到任何有助于我如何实际创建一个将被有效接受的结构的东西。功能
我也不确定我是否错误地解释了我需要做什么 - 我是否可能需要将标准句柄传递给函数或类似的东西? PHComs是否为非自定义类型,我无法在Google上找到相关信息?
现在我试图通过c#调用函数使用DLLImport属性而不是extern函数,这似乎没问题,除了我回来的句柄永远不会有效,我是盲目的(I&从来没有做过这样的事情)尝试这样做
PHCOMS
任何有关如何正确设置我的测试的帮助也会有所帮助,因为我盲目地猜测IntPtr和使用任何Safe * Handle Classes。
修改
我已将其改为像汉斯'评论:
如您所说,还有其他方法可以使用该句柄,例如下面添加的 [DllImport("MyDll.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
public static extern uint OpenRequest(ref SafeProcessHandle hComs, string host, uint fBlockingMode, uint fOpenMode, uint fDataType, SafeProcessHandle hInstance);
static void Main(string[] args)
{
IntPtr h = new IntPtr();
var handle = new SafeProcessHandle(h, true);
uint test = 0;
test = OpenRequest(ref handle, "Host01", 0, 0, 0, handle);
handle.Dispose();
}
。
有关HInstance参数所指的任何建议吗?我怀疑我是否只是再次传递相同的句柄/ IntPtr是正确的? 文档说:
hInstance HINSTANCE Windows程序必须传递其实例句柄。
ConnectRequest
修改2
[DllImport("MyDll.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
public static extern uint OpenRequest(out IntPtr hComs, string host, uint fBlockingMode, uint fOpenMode, uint fDataType, IntPtr hInstance);
[DllImport("MyDll.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
public static extern uint ConnectRequest(IntPtr hComs, uint cTimeOut);
static void Main(string[] args)
{
IntPtr hComs = new IntPtr();
uint test_OpenRequest = 0;
test_OpenRequest = OpenRequest(out hComs, "Host01", 0, 0, 0, hComs);
}
我可以运行的测试应用程序显示这应该可以工作,因为它能够连接到主机,因此我必须做错事。