Сейчас на форуме: asfa, _MBK_, Rio (+7 невидимых)

 eXeL@B —› Вопросы новичков —› Основы WIn32 API - CreateFile()
Посл.ответ Сообщение

Ранг: 2.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 02 марта 2009 13:07
· Личное сообщение · #1

Побывал на www.msdn.com, нашёл много полезной информации, в качестве первого пробного примера решил посмотреть функцию CreateFile

msdn.microsoft.com/en-us/library/bb540534(VS.85).aspx


в качстве примера приводится код к этой функции для открытия и чтения фаила

Code:
  1. #include <windows.h>
  2. #include <tchar.h>
  3. #include <stdio.h>
  4. void __cdecl _tmain(int argc, TCHAR *argv[])
  5. {
  6.     HANDLE hFile;
  7.     char DataBuffer[] = "This is a test string.";
  8.     DWORD dwBytesToWrite = (DWORD)strlen(DataBuffer);
  9.     DWORD dwBytesWritten = 0;
  10.     printf("\n");
  11.     if( argc != 2 )
  12.     {
  13.         printf("ERROR:\tIncorrect number of arguments\n\n");
  14.         printf("%s <file_name>\n", argv[0]);
  15.         return;
  16.     }
  17.     hFile = CreateFile(argv[1],                // name of the write
  18.                        GENERIC_WRITE,          // open for writing
  19.                        0,                      // do not share
  20.                        NULL,                   // default security
  21.                        CREATE_ALWAYS,          // overwrite existing
  22.                        FILE_ATTRIBUTE_NORMAL,  // normal file
  23.                        NULL); // no attr. template
  24.     if (hFile == INVALID_HANDLE_VALUE) 
  25.     { 
  26.         printf("Could not open file (error %d)\n", GetLastError());
  27.         return;
  28.     }
  29.     _tprintf(TEXT("Writing %d bytes to %s.\n"), dwBytesToWrite, argv[1]);
  30.     // This loop would most likely never repeat for this synchronous example.
  31.     // However, during asynchronous writes the system buffer may become full,
  32.     // requiring additional writes until the entire buffer is written.
  33.     while (dwBytesWritten < dwBytesToWrite)
  34.     {
  35.         if( FALSE == WriteFile(hFile,           // open file handle
  36.                                DataBuffer + dwBytesWritten,     // start of data to write
  37.                                dwBytesToWrite - dwBytesWritten, // number of bytes to write
  38.                                &dwBytesWritten, // number of bytes that were written
  39.                                NULL)            // no overlapped structure
  40.           )
  41.         {
  42.             printf("Could not write to file (error %d)\n", GetLastError());
  43.             CloseHandle(hFile);
  44.             return;
  45.         }
  46.     }
  47.     _tprintf(TEXT("Wrote %d bytes to %s successfully.\n"), dwBytesWritten, argv[1]);
  48.     CloseHandle(hFile);
  49. }


попытался я этот код запустить в Microsoft Visual Studio 2005 (вписав имя фаила test и создав test.txt фаил в директории проекта) в кольсольном приложении, но вместо открытия и чтения фаила у меня всё время выходит ошибка "Incorrect number of arguments" предусмотренная этим кодом...


интересует:

1) параметр argc, кажется, объявлен в
Code:
  1. void __cdecl _tmain(int argc, TCHAR *argv[])
, но ни где не задаётся, или задаётся автоматически?

2) где указывается директория фаила или он ищется в той же директории, где лежит запускаемая программа?

3)
Code:
  1. hFile = CreateFile(argv[1],                // name of the write
откуда берётся параметр переменной argv[1]? его нужно было указать самому?



Ранг: 28.7 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 02 марта 2009 13:15 · Поправил: Ray
· Личное сообщение · #2

happy_horror2 пишет:
void __cdecl _tmain(int argc, TCHAR *argv[])

int argc - это количество параметров, а char **argv - это массив твоих параметров.
Задаются они в ком.строке. Например: C:\test.exe argument1



Ранг: 13.7 (новичок)
Активность: 0.020
Статус: Участник

Создано: 02 марта 2009 13:39
· Личное сообщение · #3

Параметры командной строки можно задавать и в свойствах проекта в студии, если из нее запускаешь.



Ранг: 2.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 02 марта 2009 18:08
· Личное сообщение · #4

XoDeR а где в студии их указывать? можно ли их изначально задать в коде, или обязательно командной строкой надо?




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 02 марта 2009 19:41
· Личное сообщение · #5

В студии задать в настройках проекта. Можно задать и в коде, код придётся переписывать. Пока он предназначен для командной строки. И для элементарных вопросов по основам языка используйте форум по программированию (если религия не позволяет загуглить), этот форум другой направленности.


 eXeL@B —› Вопросы новичков —› Основы WIn32 API - CreateFile()
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати