【发布时间】:2010-01-29 18:25:56
【问题描述】:
我正在使用 C# 中的一些 COM 对象,其中一个有一个名为 SetLogFile 的函数,它接受一个 IntPtr。如何在 C# 中创建文件,然后将其作为 IntPtr 传递给该 COM 函数?
编辑:该函数需要一个打开的文件句柄:http://msdn.microsoft.com/en-us/library/aa915939.aspx
【问题讨论】:
标签: c# windows file com pointers
我正在使用 C# 中的一些 COM 对象,其中一个有一个名为 SetLogFile 的函数,它接受一个 IntPtr。如何在 C# 中创建文件,然后将其作为 IntPtr 传递给该 COM 函数?
编辑:该函数需要一个打开的文件句柄:http://msdn.microsoft.com/en-us/library/aa915939.aspx
【问题讨论】:
标签: c# windows file com pointers
您对于必须作为“文件”传递的内容有点模糊 - 如果您有 FileStream,您可以将 FileStream.Handle 作为 IntPtr 提交(假设它期望 HANDLE 值)
见“How to pass parameters of Type HANDLE from C# to C++ DLL”。
【讨论】:
这在很大程度上取决于SetLogFile 方法期望接收的IntPtr 参数的确切内容。如果它需要一个 COM 对象并且 C# 方法实现了适当的接口,则可以使用以下方法来传递变量。
var ptr = Marshal.GetIUnknownForObject(theParameter);
try {
theComObject.SetLogFile(ptr);
} finally {
Marshal.Release(ptr);
}
如果它需要一个实际的 Win32 句柄。您需要通过文件系统 API 获取文件句柄,然后将其传递给方法。
【讨论】:
您可能可以使用 FileStream 对象的SafeFileHandle 属性。不过,我不确定这样做的后果,因此 P/Invoke CreateFile 可能更安全。
【讨论】: