Russian Qt Forum

Программирование => С/C++ => Тема начата: BNN от Ноябрь 09, 2005, 10:30



Название: Ошибка при работе с CreateFile
Отправлено: BNN от Ноябрь 09, 2005, 10:30
Код:

#include <windows.h>
............
HANDLE        CommPort;
............
CommPort=CreateFile( "COM1",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);

При компиляции выдается ошибка:
 cannot convert `const char*' to `const WCHAR*' for a
rgument `1' to `void* CreateFileW(const WCHAR*, DWORD, DWORD, _SECURITY_ATTRIBUT
ES*, DWORD, DWORD, void*)'

Сколько не искал ни у кого вроде таких ошибок не возникает.
Компилирую gcc (MinGW).
В чем проблема?


Название: Re: Ошибка при работе с CreateFile
Отправлено: BNN от Ноябрь 09, 2005, 10:52
Цитата: "BNN"
Код:

#include <windows.h>
............
HANDLE        CommPort;
............
CommPort=CreateFile( "COM1",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);

При компиляции выдается ошибка:
 cannot convert `const char*' to `const WCHAR*' for a
rgument `1' to `void* CreateFileW(const WCHAR*, DWORD, DWORD, _SECURITY_ATTRIBUT
ES*, DWORD, DWORD, void*)'

Нашел!
В MInGW в файле winbase.h обьявлены две функции CreateFile:
Код:
WINBASEAPI HANDLE WINAPI CreateFileA(LPCSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE);
WINBASEAPI HANDLE WINAPI CreateFileW(LPCWSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE);

В программе нужно указывать какую функцию используешь, в зависимости от типа аргумента. Я указал:
 
Код:
 CommPort=CreateFileA( "COM1",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);

и все заработало.


Название: Ошибка при работе с CreateFile
Отправлено: Admin от Ноябрь 09, 2005, 14:41
еще не все

в WINXP работать не будет

так надо

Код:
HANDLE handl;

handl = CreateFile("\\\\.\\COM1",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);


Название: Ошибка при работе с CreateFile
Отправлено: pastor от Февраль 04, 2006, 00:47
Цитата: "Admin"
еще не все

в WINXP работать не будет

так надо

Код:
HANDLE handl;

handl = CreateFile("\\\\.\\COM1",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);



    Такой вызов функции
Код:
CreateFile( "COM1",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL)

прекрасно работает под WinXP. Проверено 1000 раз!!!
    Дело в следующем: если мы пытаемся открыть порт с именами COM1-COM9, то приставку \\.\ можно не писать (система сама это поправит), а если мы пытаемся открыть порт с номером больше 9, то здесь действительно произойдет ошибка открытия порта. В этом случае необходимо дописать данную приставку.