Pinvoke命令长度错误
Pinvoke command length is incorrect
我试图获得FILE_ID_BOTH_DIR_INFO与GetFileInformationByHandle
函数。调用后,我的所有值都被设置为零。
我得到win32错误消息:
ERROR_BAD_LENGTH程序发出命令,但命令长度不正确
IntPtr handle = CreateFile(dir, EFileAccess.GenericRead, EFileShare.Read, IntPtr.Zero, ECreationDisposition.OpenExisting, EFileAttributes.BackupSemantics | EFileAttributes.Normal, IntPtr.Zero);
FILE_ID_BOTH_DIR_INFO fileStruct = new FILE_ID_BOTH_DIR_INFO();
GetFileInformationByHandleEx(handle, FILE_INFO_BY_HANDLE_CLASS.FileIdBothDirectoryInfo, out fileStruct, (uint)Marshal.SizeOf(fileStruct));
FILE_ID_BOTH_DIR_INFO结构 typedef struct _FILE_ID_BOTH_DIR_INFO {
DWORD NextEntryOffset;
DWORD FileIndex;
LARGE_INTEGER CreationTime;
LARGE_INTEGER LastAccessTime;
LARGE_INTEGER LastWriteTime;
LARGE_INTEGER ChangeTime;
LARGE_INTEGER EndOfFile;
LARGE_INTEGER AllocationSize;
DWORD FileAttributes;
DWORD FileNameLength;
DWORD EaSize;
CCHAR ShortNameLength;
WCHAR ShortName[12];
LARGE_INTEGER FileId;
WCHAR FileName[1];
} FILE_ID_BOTH_DIR_INFO, *PFILE_ID_BOTH_DIR_INFO
用c# public struct FILE_ID_BOTH_DIR_INFO
{
uint NextEntryOffset;
uint FileIndex;
LARGE_INTEGER CreationTime;
LARGE_INTEGER LastAccessTime;
LARGE_INTEGER LastWriteTime;
LARGE_INTEGER ChangeTime;
LARGE_INTEGER EndOfFile;
LARGE_INTEGER AllocationSize;
uint FileAttributes;
uint FileNameLength;
uint EaSize;
char ShortNameLength;
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 12)]
string ShortName;
LARGE_INTEGER FileId;
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 1)]
string FileName;
}
[StructLayout(LayoutKind.Explicit, Size = 8)]
struct LARGE_INTEGER
{
[FieldOffset(0)]
public Int64 QuadPart;
[FieldOffset(0)]
public UInt32 LowPart;
[FieldOffset(4)]
public Int32 HighPart;
}
ByValTStr的字符集由StructLayout属性的CharSet参数决定。由于您没有指定,因此使用默认的8位ANSI。如果您指定CharSet为CharSet。Unicode应该能解决这个问题。将这个属性添加到struct中:
[StructLayout(LayoutKind.Sequential,
CharSet=CharSet.Unicode)]
为了调试的目的,编写一个c++程序输出结构体的大小。确保你的c#程序匹配这个值。
相关文章:
- Netbeans 10:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- CMake 错误:链接器命令失败,退出代码为 1 和 cpp.o 文件
- clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) - 体系结构的未定义符号 x86_64:
- 如何修复 clang: 错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- 添加符号 libgtest.so 错误:命令行中缺少 DSO
- 尝试构建 xerces c++ 解析器。Netbeans 和命令行构建错误未定义对"xercesc_3_2..."的引用
- qt C++命令行代码中的分段错误(核心转储)
- C++ 错误检查 fstream open() 命令和一般字符串流错误处理
- 当命令失败时,gzip 会在 C++ 中返回错误代码吗?
- 从 C++ 调用 cURL 命令会返回意外的错误代码,如 1792 和 6656
- Android NDK.Build命令失败.未定义的引用.clang++:错误:链接器命令失败,退出代码为1
- 如何在长g++错误消息上使用linux less命令
- 错误:链接器命令失败,退出代码为 1(使用 -v 查看调用):在 Macbook 上
- 如何处理错误"E1696命令行错误:无法在Visual Studio 2017中打开元数据文件"mscorlib.dll"?
- GCC-7:错误:无法识别的命令行选项"-M64"
- 输出错误命令的条件语句
- 错误:“命令” /重复使用ASM挥发性之前的预期字符串字母
- 在mac上构建Google测试时出现链接错误(命令行)
- glfw3错误:命令行中缺少DSO
- 为什么我会在意外标记附近出现语法错误?命令行参数