Will
Will

Reputation: 10421

How to PInvoke SFileFindFirstFile

The declaration is

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)</pre>

I tried

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);

Is this right? It doesn't error but it doesn't return what it should.

Upvotes: 0

Views: 224

Answers (1)

wj32
wj32

Reputation: 8403

szPlainName shouldn't be byte[] - how does the runtime know how big the array is? Try this:

[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
}

Upvotes: 1

Related Questions