gpt4 book ai didi

C# 使用 FILE* 参数调用 C 函数

转载 作者:太空狗 更新时间:2023-10-29 15:35:48 24 4
gpt4 key购买 nike

我在 C 库的结构中定义了以下函数指针:

struct SOME_STRUCT {
[...]
uint8_t(*printinfo) (SOME_STRUCT * ss, FILE * hFile);
[...]
}

此函数将一些数据写入文件句柄 hFile,我想从 C# 调用它。在 C# 中,我有:

[StructLayout(LayoutKind.Sequential)]
public struct SomeStruct
{
[...]
public printinfoDelegate printinfo;

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate byte printinfoDelegate(IntPtr ss, IntPtr hFile);
[...]
}

我使用下面的代码来调用函数:

SomeStruct sStruct = [...];
String output;

using (FileStream stream = new FileStream(tmpFileName, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
{
IntPtr structPtr = Marshal.AllocHGlobal(Marshal.SizeOf(sStruct));
Marshal.StructureToPtr(sStruct, structPtr, false);

byte result = sStruct.printinfo(structPtr, stream.SafeFileHandle.DangerousGetHandle());

stream.Seek(0, System.IO.SeekOrigin.Begin);

using (System.IO.StreamReader reader = new System.IO.StreamReader(stream))
{
output = reader.ReadToEnd();
}
}

但我无法让它工作。我怀疑问题是我不能将文件流中的句柄作为 FILE* 传递。任何帮助将不胜感激...

最佳答案

.NET 中的句柄是指 Win32 HANDLE(或 HINSTANCE 等等),例如CreateFile 返回的那个功能。另一方面,FILE * 是 C 运行时库的一部分,通过调用 fopen 函数返回。

因此,如果您想使用带有FILE * 参数的函数,那么您还必须P/Invoke fopen 方法,就像在here 中一样。 .

关于C# 使用 FILE* 参数调用 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22068568/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com