Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WriteFile, Объясните что не так? 
V
    Опции темы
mazik
Дата 17.10.2008, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 1.10.2007

Репутация: нет
Всего: нет



Есть такой участок кода:
Код

char *data;DWORD numofbyte=0; 
hFile = CreateFile(_T("1111.fr"),GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED ,NULL);

if (hFile == INVALID_HANDLE_VALUE)
    {CreateFile(_T("1111.fr"),GENERIC_WRITE,0,NULL,CREATE_NEW,FILE_FLAG_OVERLAPPED ,NULL);}
SetFilePointer(hFile,1,NULL,FILE_END);
data=(char*)malloc(ParamSize);
sprintf_s(data,ParamSize,"%s\t",ptr[i-1]);
size_t yy=strlen(data);
BOOL hhh=WriteFile(hFile,data,(DWORD)yy,&numofbyte,NULL);

На функцию WriteFile компилятор не ругается , но при выполнении возвращаемое значение - 0 и GetLastError возвращает 
ошибку (87) The parameter is incorrect.  ERROR_INVALID_PARAMETER 
 Где и что не так? smile 
PM MAIL   Вверх
eyeofhell
Дата 17.10.2008, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Адепт
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 16.10.2008
Где: Россия, Москва

Репутация: 1
Всего: 1



Цитата

Где и что не так?


Строка 5: CreateFile() вызываете, а результат не сохраняете. В результате все функции вызываются с hFile равным INVALID_HANDLE_VALUE, о чем и сообщает GetLastError()
PM MAIL ICQ   Вверх
mazik
Дата 17.10.2008, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 1.10.2007

Репутация: нет
Всего: нет



вообще-то GetLastError() сообщает ERROR_INVALID_PARAMETER  а не INVALID_HANDLE_VALUE но предложенное попробовал- результат тот же
PM MAIL   Вверх
eyeofhell
Дата 17.10.2008, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Адепт
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 16.10.2008
Где: Россия, Москва

Репутация: 1
Всего: 1



Цитата

вообще-то GetLastError() сообщает ERROR_INVALID_PARAMETER  а не INVALID_HANDLE_VALUE 


Все правильно:
Код


char *data;DWORD numofbyte=0; 
// используется OPEN_EXISTING, но файла еще нету. hFile равно INVALID_HANDLE_VALUE
hFile = CreateFile(_T("1111.fr"),GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED ,NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
  // результат CreateFile() не кладется в hFile, поэтому hFile остается INVALID_HANDLE_VALUE
  CreateFile(_T("1111.fr"),GENERIC_WRITE,0,NULL,CREATE_NEW,FILE_FLAG_OVERLAPPED ,NULL);
}
// передается hFile равный INVALID_HANDLE_VALUE. Это неправильный параметр,
// поэтому GetLastError() возвращает ERROR_INVALID_PARAMETER ( "ошибка: неправильный параметр" )
BOOL hhh=WriteFile(hFile,data,(DWORD)yy,&numofbyte,NULL);


Цитата

но предложенное попробовал- результат тот же 


Утром телепатия плохо работает :(. Если нужна консультация - надобно код показать или подождать пока  я проснусь / более могучие телепаты захотят помочь smile.
PM MAIL ICQ   Вверх
Lazin
Дата 17.10.2008, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



вместо таких сложных схем с многократным вызовом CreteFile, проще его вызвать один раз, с параметром OPEN_ALLWAYS, вместо CREATE_NEW и OPEN_EXISTING smile 
PM MAIL Skype GTalk   Вверх
mazik
Дата 17.10.2008, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 1.10.2007

Репутация: нет
Всего: нет



Полный код:
Код

DWORD    WINAPI        ThreadFunc(LPVOID lParam)
{    
    THRPARAM *param=(THRPARAM*)lParam;param->exitprocess=TRUE;HANDLE hFile;
    SQLWCHAR *OutConnectionString=0;SQLSMALLINT *StringLength2Ptr=0;
    SQLWCHAR *constring = (SQLWCHAR*) _T("Driver={Microsoft ODBC for Oracle};Server=OMAP1;Uid=sm_statistics;Pwd=sm_statistics;");
    SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &param->henv);
    SQLSetEnvAttr( param->henv, SQL_ATTR_ODBC_VERSION, ( void* )SQL_OV_ODBC3, 0 );
    SQLAllocHandle( SQL_HANDLE_DBC, param->henv, &param->hdbc );
    int retcode = SQLDriverConnect(param->hdbc,NULL,constring,97,OutConnectionString, 1024,StringLength2Ptr, SQL_DRIVER_COMPLETE);
    SQLAllocHandle( SQL_HANDLE_STMT, param->hdbc, &param->hdstmt );
    if ( retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO )
        MessageBoxW( NULL, _T("Connected!"), _T(""), MB_OK | MB_ICONERROR );
     else 

        MessageBoxW( NULL, _T("Not connected!"), _T(""), MB_OK | MB_ICONERROR );
    
    SQLINTEGER   sbf[3];SQLSMALLINT DataType,i,BuffLength=0,NameLengthPtr, DecimalDigits, Nullable;SQLUINTEGER ParamSize;
    SQLCHAR* ptr[3],ColName=NULL;

    SQLWCHAR selecttxt[]=_T("select * from (select source_address,count (source_address) as counter, source_msc_address from  sm_trace.trace_info where ARRIVAL_DATE_AND_TIME between to_date('20/09/2008 00:00:00'  ,'dd/mm/yyyy hh24:mi:ss') and to_date('20/09/2008 23:59:59','dd/mm/yyyy hh24:mi:ss')and source_msc_address not like '375%' and target_address not like '375%'and message_type <> 1 group by source_address, source_msc_address order by counter DESC)where counter >20");

    retcode = SQLExecDirectW(param->hdstmt,  selecttxt,   SQL_NTS);
    if (retcode == SQL_SUCCESS) 
        {    char *data;DWORD numofbyte=0; 
hFile = CreateFile(_T("1111.fr"),GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_FLAG_OVERLAPPED ,NULL);                            
                        }
SetFilePointer(hFile,1,NULL,FILE_END);
    while (TRUE) 
        {    
        retcode = SQLFetch(param->hdstmt);                        
        if (retcode==SQL_NO_DATA||retcode==SQL_ERROR)break;                                                    
        if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
        {                            
        for (i=1;i<4;i++)
        {    
            SQLDescribeCol(param->hdstmt, i, (SQLWCHAR*)ColName, BuffLength,&NameLengthPtr,&DataType,&ParamSize, &DecimalDigits, &Nullable);
    if (ParamSize==0)ParamSize=6;
        ptr[i-1]=(SQLCHAR*)malloc(ParamSize);
        SQLGetData(param->hdstmt, i, SQL_C_CHAR, ptr[i-1], ParamSize, &sbf[i-1]);
        data=(char*)malloc(ParamSize);
        sprintf_s(data,ParamSize,"%s",ptr[i-1]);
        size_t yy=strlen(data);
        BOOL hhh=WriteFile(hFile,data,(DWORD)yy,&numofbyte,NULL);


    DWORD dw = GetLastError();
    LPVOID lpMsgBuf;    
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,NULL,dw,
                                                  LANG_SYSTEM_DEFAULT,(LPTSTR) &lpMsgBuf,0, NULL );
MessageBox(NULL, (LPCWSTR)lpMsgBuf, (LPCWSTR)"Error", MB_OK); 
::LocalFree(lpMsgBuf);


free(data);
}
for (i=0;i<3;i++) free(ptr[i]);                            
}
}
CloseHandle(hFile);    

SQLCloseCursor(param->hdstmt);    
SQLFreeHandle( SQL_HANDLE_STMT, param->hdstmt );
 SQLDisconnect( param->hdbc );
  SQLFreeHandle( SQL_HANDLE_DBC, param->hdbc );
  SQLFreeHandle( SQL_HANDLE_ENV, param->henv );    
    param->exitprocess=FALSE;
    return 0;
}

PM MAIL   Вверх
Lazin
Дата 17.10.2008, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



mazik, уже написали из-за чего не работает

Добавлено через 26 секунд
Цитата(eyeofhell @  17.10.2008,  10:21 Найти цитируемый пост)
// результат CreateFile() не кладется в hFile, поэтому hFile остается INVALID_HANDLE_VALUE


PM MAIL Skype GTalk   Вверх
mazik
Дата 17.10.2008, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 1.10.2007

Репутация: нет
Всего: нет



2 Lazin:
сорри если повторяюсь, но здесь код с учетом замечания, сказанного тобой
Цитата

вместо таких сложных схем с многократным вызовом CreteFile, проще его вызвать один раз, с параметром OPEN_ALLWAYS, вместо CREATE_NEW и OPEN_EXISTING   

и все равно не работает
PM MAIL   Вверх
Lazin
Дата 17.10.2008, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



у тебя между созданием файла и записью в него столько всего происходит, может дело в ф-ии SetFilePointer? попробуй вызвать ее так:
SetFilePointer(hFile, 0, 0, FILE_END);
если конечно я тебя правильно понял
плюс ты не проверяешь что возвращают функции WriteFile, SetFilePointer и CreateFile
PM MAIL Skype GTalk   Вверх
mazik
Дата 17.10.2008, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 1.10.2007

Репутация: нет
Всего: нет



2 Lazin:
Спасибо за наводку в сторону SetFilePointer. Проблема решена. Дело было в использовании флага FILE_FLAG_OVERLAPPED при открытии файла. Как написано в описании к ф-ции SetFilePointer:
"The file pointer that is identified by the value of the hFile parameter is not used for overlapped read and write operations. "
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0930 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.