Portál AbcLinuxu, 8. listopadu 2025 23:00
fread a fwrite ze stdio.h? V C# je lze zadeklarovat takto:
[DllImport("msvcrt.dll", SetLastError=true)]
static extern IntPtr fread(byte[] buffer, IntPtr size, IntPtr count, IntPtr stream);
[DllImport("msvcrt.dll", SetLastError=true)]
static extern IntPtr fwrite(byte[] buffer, IntPtr size, IntPtr count, IntPtr stream);
stream vlastně zač. Pokud je to ukazatel nebo má velikost ukazatele, lze návratový typ deklarovat jako IntPtr.
Z C# jsem si schopen zavolat funkci OpenXmlBridge, avšak samotným zavoláním se program logicky zastaví...Tomu nerozumím, když s tím pracujete asynchronně. Mj. deklarace pro funkce
ReadFileEx a WriteFileEx lze najít na serveru pinvoke.net (jsou v knihovně kernel32.dll).
[DllImport("Moje.dll", SetLastError = true)]
private static extern SafeFileHandle OpenXMLBridge();
//Pak se s tím dá pracovat přes
SafeFileHandle handler = OpenXMLBridge();
FileStream fs = new FileStream(handler, FileAccess.ReadWrite, 4096, true);
Průšvih je, že mi to padá při druhém čtení či zápisu, při fs.Close() mi to padá. Ale... to snad již nějak dořeším.
OpenXMLBridge funkce z té DLL knihovny v C a nevrací klasický windowsovský handle? Pokud ano, tak byste tam měl mít IntPtr:
[DllImport("Moje.dll", SetLastError = true)]
private static extern IntPtr OpenXMLBridge();
a pracovalo by se s tím takto:
var handle = new SafeFileHandle(OpenXMLBridge(), true); var fs = new FileStream(handle, FileAccess.ReadWrite, 4096, true);
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.