Странный результат после SQLConfigDataSource

Тема в разделе "WASM.WIN32", создана пользователем laser1985, 6 окт 2008.

  1. laser1985

    laser1985 New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2008
    Сообщения:
    3
    Есть следующий код:

    Код (Text):
    1. #include "stdafx.h"
    2. #include <windows.h>
    3. #include <stdio.h>
    4. #include <tchar.h>
    5. #include <ODBCINST.H> //Подключаем для вызова функции SQLConfigDataSource
    6.  
    7. int _tmain(int argc, _TCHAR* argv[])
    8. {
    9. bool rst;
    10. int  err = GetLastError();
    11.    
    12. //BOOL SQLConfigDataSource(HWND hwndParent,UINT fRequest, LPCSTR lpszDriver, LPCSTR lpszAttributes);
    13.    
    14. rst = SQLConfigDataSource(NULL, ODBC_ADD_DSN, TEXT("Microsoft Access Driver (*.mdb)"),TEXT ("CREATE_DB=c:\\log_database.mdb General\0"));
    15.  
    16. err = GetLastError();
    17.  
    18. static  char msgBuf[256];
    19. FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, 0, msgBuf, sizeof msgBuf, NULL) ;
    20.    
    21. return 0;
    22. }
    Функция SQLConfigDataSource возвращает true - файл создается нормально, но результат вызова GetLastError() не ноль, а 0x0000007e (не найден указанный модуль).
    Что здесь не так ? Может кто нибудь сталкивался.
    Спасибо.
     
  2. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Всё нормально. GetLastError надо вызывать если функция не отработает и вернёт false.
     
  3. laser1985

    laser1985 New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2008
    Сообщения:
    3
    Спасибо.
    Ну если честно все равно хочется узнать почему GetLastError() не ноль.
    Сколько вызывал GetLastError() после API шных функций, всегда если все нормально возвращался 0.
     
  4. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Это значит что возникшая внутренняя ошибка API функции была успешно ею же и обработана, встречается это не так уж и редко. А вообще-то такая "псевдоошибка" долго висеть пока не затрётся настоящей.
     
  5. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Не всегда.
    Сама SQLConfigDataSource вызывает, я думаю, ещё очень много других функций.
    Ну вот, например, кусок некой функции:
    Код (Text):
    1. HMODULE hLib=LoadLibrary("123.dll");
    2. if(hLib!=INVALID_HANDLE_VALUE)
    3. {  ...  }
    4. else
    5. {  ...  }
    Если 123.dll не будет найдена, то в LAST_ERROR будет ERROR_MODULE_NOT_FOUND, но сама функция выполнится корректно.

    Поэтому правильнее писать:
    Код (Text):
    1. rst = SQLConfigDataSource(NULL, ODBC_ADD_DSN, TEXT("Microsoft Access Driver (*.mdb)"),TEXT ("CREATE_DB=c:\\log_database.mdb General\0"));
    2. if(!rst)
    3. {
    4.  err = GetLastError();
    5.  static  char msgBuf[256];
    6.  FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, 0, msgBuf, sizeof msgBuf, NULL) ;
    7.  return 1;
    8. }
    9. return 0;
     
  6. laser1985

    laser1985 New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2008
    Сообщения:
    3
    Мне теперь все ясно.
    Спасибо всем.