[DllImport("msvcrt.dll", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi, SetLastError=true)]
public static extern Int32 fopen_s(out IntPtr pFile, String filename, String mode);
[DllImport("msvcrt.dll", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Unicode, SetLastError=true)]
public static extern Int32 _wfopen_s(out IntPtr pFile, String filename, String mode);
<DllImport("msvcrt.dll", CallingConvention:=CallingConvention.Cdecl, CharSet:=CharSet.Ansi, SetLastError:=True)> _
Public Shared Function fopen_s(ByRef pFile As IntPtr, ByVal filename As String, ByVal mode As String) As Int32
End Function
<DllImport("msvcrt.dll", CallingConvention:=CallingConvention.Cdecl, CharSet:=CharSet.Unicode, SetLastError:=True)> _
Public Shared Function _wfopen_s(ByRef pFile As IntPtr, ByVal filename As String, ByVal mode As String) As Int32
End Function
It is advisable to use _wfopen_s whenever possible. fopen_s supports Unicode but requires additional "help"; you must add a "ccs=encoding" parameter to the mode parameter. Valid encoding values are UNICODE, UTF-8, and UTF-16LE; if ccs is not provided, fopen_s falls back to ASCII (it is unknown what happens if an invalid value is passed).
Please add some!
Opening a Unicode file (example.txt) for writing (C#):
// "incorrect" way
IntPtr file;
if (!fopen_s(out file, "example.txt", "w, ccs=UNICODE"))
// fail
else
// success
// "correct" way
IntPtr file;
if (!_wfopen_s(out file, "example.txt", "w"))
// fail
else
// success
fopen (includes _wfopen)