Как вызвать SFileFindFirstFile - PullRequest
       4

Как вызвать SFileFindFirstFile

0 голосов
/ 19 ноября 2010

Декларация

<code>typedef struct _SFILE_FIND_DATA
{
    char   cFileName[MAX_PATH];         // Full name of the found file
    char * szPlainName;                 // Plain name of the found file
    DWORD  dwHashIndex;                 // Hash table index for the file
    DWORD  dwBlockIndex;                // Block table index for the file
    DWORD  dwFileSize;                  // File size in bytes
    DWORD  dwFileFlags;                 // MPQ file flags
    DWORD  dwCompSize;                  // Compressed file size
    DWORD  dwFileTimeLo;                // Low 32-bits of the file time (0 if not present)
    DWORD  dwFileTimeHi;                // High 32-bits of the file time (0 if not present)
    DWORD  lcLocale;                    // Locale version

} SFILE_FIND_DATA, *PSFILE_FIND_DATA;

HANDLE WINAPI SFileFindFirstFile(HANDLE hMpq, const char * szMask, SFILE_FIND_DATA * lpFindFileData, const char * szListFile)

Я пытался

public unsafe struct SFILE_FIND_DATA
{
    fixed byte cFileName[260];         // Full name of the found file
    byte[] szPlainName;                 // Plain name of the found file
    uint dwHashIndex;                 // Hash table index for the file
    uint dwBlockIndex;                // Block table index for the file
    uint dwFileSize;                  // File size in bytes
    uint dwFileFlags;                 // MPQ file flags
    uint dwCompSize;                  // Compressed file size
    uint dwFileTimeLo;                // Low 32-bits of the file time (0 if not present)
    uint dwFileTimeHi;                // High 32-bits of the file time (0 if not present)
    uint lcLocale;                    // Locale version

}

[DllImport("StormLib.dll")]
public static extern uint SFileFindFirstFile(IntPtr hMpq, [MarshalAs(UnmanagedType.LPStr)] string mask,
    out SFILE_FIND_DATA filedata, [MarshalAs(UnmanagedType.LPStr)] string listfile);

Это правильно? Это не ошибка, но не возвращает то, что должно.

1 Ответ

1 голос
/ 19 ноября 2010

szPlainName не должно быть byte[] - как среда выполнения узнает, насколько велик массив?Попробуйте это:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public unsafe struct SFILE_FIND_DATA
{
    fixed byte cFileName[260];         // Full name of the found file
    string szPlainName;                 // Plain name of the found file
    uint dwHashIndex;                 // Hash table index for the file
    uint dwBlockIndex;                // Block table index for the file
    uint dwFileSize;                  // File size in bytes
    uint dwFileFlags;                 // MPQ file flags
    uint dwCompSize;                  // Compressed file size
    uint dwFileTimeLo;                // Low 32-bits of the file time (0 if not present)
    uint dwFileTimeHi;                // High 32-bits of the file time (0 if not present)
    uint lcLocale;                    // Locale version
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...