с++ ввод имени файла через винАпи и ком. строку


int main (int argc, LPTSTR argv[])
{
 cout<<argv[1]<<endl<<argv [2];// вот здесь выводит какуюто чупуху а не имя фала.. (имя файла не кирилицей)
 getch();
 HANDLE hIn, hOut;
 hIn=CreateFile (argv[1], GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);// ну и здесь конечно ошибка..
}

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
оно совсем правильное правильно, есть два варианта мейн у майкрософтовского компилятора: main & wmain
у main не может быть юникодных параметров,
лучше пиши, так:
int _tmain (int argc, _TCHAR* argv [])

и оно правильно раскроется в зависимости от значения дефайна UNICODE

чесно говоря непойму как ожно было неправильно хедеры подключить... я просто написал

Я неправильно выразился:) #define UNICODE, затем #include < windows.h>, тогда всё замапится в W функции. От версии MSVC зависит, она при создании проекта сама прописывает глобальный дефайн UNICODE для разных типов проектов, я всегда пустой создаю, потом уже сам управляю где мне нужно в unicode, а где нет.

TO Mike Gorchak
большое спасибо!!!

чесно говоря непойму как ожно было неправильно хедеры подключить... я просто написал

 #include <windows.h>

... и все...

нужно было екраз при включеном юникоде явно вызвать CreateFileA и еще написать так

int main (int argc, LPCSTR argv[])

и cout и открытие файла все работает нормально…

спасибо!

unicode пробовал отключать вот сдесь: Имя_Проекта-Properties-> С\С±> Use UNICODE Response Files...

Это для юникодных имён файлов.
General -> Project Defaults -> Character Set -> поставить в multi byte — это для отключения unicode.

Возможная причина, если неправильно подключить виндовые хедеры, то CreateFile может задефайниться в CreateFileA, в то время как данные передаются как для CreateFileW. Попробуй явно вызвать CreateFileW, когда проект юникодный.

вы все так сосредоточились на cout... хотя проблема в том что вместо asrgv [1] у меня какаято чепуха вместо имени файла...
unicode пробовал отключать вот сдесь: Имя_Проекта-Properties-> С\С±> Use UNICODE Response Files...
непомогло...
проверка на argc > =3 есть просто я кинул самый важный код...

GetLastError — возвращает 123...

hIn=CreateFile (argv [1], GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);// ну и здесь конечно ошибка...
ну конечно ошибка... если вместо имен файлов

— — 003953D7 — 003953DF — вот это...

0. добавить проверку argc > =3
1. LPTSTR argv [] возможен вариант когда там юникод,
значить пихать в cout нельзя, можно использовать wcout, а еще лучше DebugOutput (смотреть в msdn)
2. hIn=CreateFile (argv [1], GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);// ну и здесь конечно ошибка...

почему «и здесь конечно ошибка...»? в качестве имени принимает LPTSTR без проблем, посмотри сигнатуру, выведи имя в лог, тогда станет понятней в чем дело. и не забываем про ф-цию GetLastError

В проекте посмотри включен ли по умолчанию unicode.
Если unicode включён, то выключи, если надо чтобы было включённым используй wcstombs () или WideCharToMultiByte () перед выводом в cout.
Проверяй ошибки после вызова каждого из winapi вызовов.

Это всё.

Підписатись на коментарі