Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Запись файла / 10 сообщений из 10, страница 1 из 1
22.02.2020, 15:21
    #39929769
Cytrus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись файла
Привет.

У меня почему-то не получается записать файл с помощью WinAPI.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
[DllImport("kernel32.dll",CharSet=CharSet.Unicode,SetLastError=true)]
public static extern IntPtr CreateFileW(string a,int b,int c,IntPtr d,int e,int f,IntPtr g);
[DllImport("kernel32.dll",CharSet=CharSet.Unicode,SetLastError=true)]
public static extern bool CloseHandle(IntPtr a);
[DllImport("kernel32.dll",CharSet=CharSet.Unicode,SetLastError=true)]
public static extern bool WriteFile(IntPtr a,IntPtr b,int c,IntPtr d,IntPtr e);
IntPtr p=Marshal.AllocCoTaskMem(512); 
IntPtr h=CreateFileW("C:\\111.txt",0x40000000,0,IntPtr.Zero,1,0,IntPtr.Zero);
bool z=WriteFile(h,p,200,IntPtr.Zero,IntPtr.Zero);    
Marshal.FreeCoTaskMem(p);    
bool b=CloseHandle(h);



Что можно сделать?
...
Рейтинг: 0 / 0
22.02.2020, 16:32
    #39929781
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись файла
Cytrus,

1. Какая ошибка?
2. Зачем WinAPI?
...
Рейтинг: 0 / 0
22.02.2020, 17:38
    #39929790
Cytrus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись файла
hVostt, вот такая.

System.AccessViolationException:
Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.
...
Рейтинг: 0 / 0
22.02.2020, 19:22
    #39929838
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись файла
Раз уж винапи (которое действительно непонятно зачем), то после вызова методов надо проверять результат (у CreateFileW на INVALID_HANDLE_VALUE, у WriteFile на false), и в случае возврата, сообщающего об ошибке, вызывать GetLastError, или Marshal.GetLastWin32Error. Ну и потом, чтобы было понятно, что это было - FormatMessage c выводом результата.
...
Рейтинг: 0 / 0
22.02.2020, 22:14
    #39929867
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись файла
Cytrus
Что можно сделать?

внимательно прочитать https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-writefile

lpNumberOfBytesWritten - This parameter can be NULL only when the lpOverlapped parameter is not NULL

поэтому и "Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена."
...
Рейтинг: 0 / 0
23.02.2020, 04:03
    #39929918
Cytrus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись файла
Изопропил, ну а какие должны быть два последних параметра?
...
Рейтинг: 0 / 0
23.02.2020, 11:13
    #39929931
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись файла
Cytrus,

последний - IntPtr.Zero
предпоследний - LPDWORD lpNumberOfBytesWritten
на c# -тип out uint
...
Рейтинг: 0 / 0
23.02.2020, 14:33
    #39929969
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись файла
лучше использовать SafeHandle или FileHandle, а не IntPtr
...
Рейтинг: 0 / 0
23.02.2020, 15:25
    #39929975
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись файла
hVostt
2. Зачем WinAPI?

Вот меня тоже люто заинтриговал этот вопрос.
...
Рейтинг: 0 / 0
23.02.2020, 16:06
    #39929978
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись файла
Roman Mejtes
лучше использовать SafeHandle или FileHandle, а не IntPtr

до этого "лучше" ещё дожить нужно ))
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Запись файла / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]