Marshalling WIN32_FIND_DATA

G

Guest

Does anyone have a good C# marshalling for the WIN32_FIND_DATA structure used
with API functions FindFirstFile, FindNextFile, FtpFindFirstFile and
InternetFindNextFile?

Have modeled as follows

[StructLayout(LayoutKind.Sequential)]
public class FILETIME
{
public int dwLowDateTime;
public int dwHighDateTime;
};


[StructLayout(LayoutKind.Sequential)]
public class WIN32_FIND_DATA
{
public const int MAX_PATH = 260;
public int dwFileAttributes;
public FILETIME ftCreationTime;
public FILETIME ftLastAccessTime;
public FILETIME ftLastWriteTime;
public int nFileSizeHigh;
public int nFileSizeLow;
public int dwReserved0;
public int dwReserved1;
[MarshalAs(UnmanagedType.LPStr, SizeConst=MAX_PATH)]
public string cFileName;
[MarshalAs(UnmanagedType.LPStr, SizeConst=14)]
public string cAlternateFileName;
};

[DllImport("kernel32.dll", CharSet=CharSet.Auto)]
public static extern int FindFirstFile(string szSearchFile,
[MarshalAs(UnmanagedType.LPStruct)] WIN32_FIND_DATA lpFindFileData)

Calls to FindFirstFile, FindNextFile etc. produce a good handle but no data
in the WIN32_FIND_DATA structure.
 
M

Mattias Sjögren

Does anyone have a good C# marshalling for the WIN32_FIND_DATA structure used
with API functions FindFirstFile, FindNextFile, FtpFindFirstFile and
InternetFindNextFile?

Try www.pinvoke.net

[StructLayout(LayoutKind.Sequential)]
public class FILETIME
{
public int dwLowDateTime;
public int dwHighDateTime;
};

FILETIME is already available as a struct in the
System.Runtime.InteropServices namespace. So no need to redeclare it,
expecially not as a class.

[StructLayout(LayoutKind.Sequential)]
public class WIN32_FIND_DATA

Since the function is set to use CharSet.Auto, so should this type.

[DllImport("kernel32.dll", CharSet=CharSet.Auto)]
public static extern int FindFirstFile(string szSearchFile,
[MarshalAs(UnmanagedType.LPStruct)] WIN32_FIND_DATA lpFindFileData)

Calls to FindFirstFile, FindNextFile etc. produce a good handle but no data
in the WIN32_FIND_DATA structure.

Try getting rid of the MarshalAs(UnmanagedType.LPStruct) attribute,
and add the [In, Out] attributes instead.



Mattias
 
K

Klaus H. Probst

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
private struct FILETIME
{
public uint dwLowDateTime;
public uint dwHighDateTime;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
private struct SYSTEMTIME
{
public short wYear;
public short wMonth;
public short wDayOfWeek;
public short wDay;
public short wHour;
public short wMinute;
public short wSecond;
public short wMilliseconds;
}

private const int MAX_PATH = 260;
private const int INVALID_HANDLE_VALUE = -1;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
private struct WIN32_FIND_DATA
{
public uint dwFileAttributes;
public FILETIME ftCreationTime;
public FILETIME ftLastAccessTime;
public FILETIME ftLastWriteTime;
public uint nFileSizeHigh;
public uint nFileSizeLow;
public uint dwReserved0;
public uint dwReserved1;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH)]
public string cFileName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)]
public string cAlternateFileName;
}
 
P

Per Rollvang

BobT said:
Does anyone have a good C# marshalling for the WIN32_FIND_DATA structure
used
with API functions FindFirstFile, FindNextFile, FtpFindFirstFile and
InternetFindNextFile?

Have modeled as follows
....snip...

Calls to FindFirstFile, FindNextFile etc. produce a good handle but no
data
in the WIN32_FIND_DATA structure.

This works for me...

// Declare a class member for it
[ StructLayout( LayoutKind.Sequential, CharSet=CharSet.Auto )]
private class FindData
{
public int fileAttributes = 0;
// creationTime was a FILETIME struct.
public int creationTime_lowDateTime = 0 ;
public int creationTime_highDateTime = 0;
// lastAccessTime was a FILETIME struct.
public int lastAccessTime_lowDateTime = 0;
public int lastAccessTime_highDateTime = 0;
// lastWriteTime was a FILETIME struct.
public int lastWriteTime_lowDateTime = 0;
public int lastWriteTime_highDateTime = 0;
public int nFileSizeHigh = 0;
public int nFileSizeLow = 0;
public int dwReserved0 = 0;
public int dwReserved1 = 0;
[ MarshalAs( UnmanagedType.ByValTStr, SizeConst=256 )]
public String fileName = null;
[ MarshalAs( UnmanagedType.ByValTStr, SizeConst=14 )]
public String alternateFileName = null;
}

Hope this helps,

-Per
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top