Есть следующий код: Код (Text): #include "stdafx.h" #include <windows.h> #include <stdio.h> #include <tchar.h> #include <ODBCINST.H> //Подключаем для вызова функции SQLConfigDataSource int _tmain(int argc, _TCHAR* argv[]) { bool rst; int err = GetLastError(); //BOOL SQLConfigDataSource(HWND hwndParent,UINT fRequest, LPCSTR lpszDriver, LPCSTR lpszAttributes); rst = SQLConfigDataSource(NULL, ODBC_ADD_DSN, TEXT("Microsoft Access Driver (*.mdb)"),TEXT ("CREATE_DB=c:\\log_database.mdb General\0")); err = GetLastError(); static char msgBuf[256]; FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, 0, msgBuf, sizeof msgBuf, NULL) ; return 0; } Функция SQLConfigDataSource возвращает true - файл создается нормально, но результат вызова GetLastError() не ноль, а 0x0000007e (не найден указанный модуль). Что здесь не так ? Может кто нибудь сталкивался. Спасибо.
Спасибо. Ну если честно все равно хочется узнать почему GetLastError() не ноль. Сколько вызывал GetLastError() после API шных функций, всегда если все нормально возвращался 0.
Это значит что возникшая внутренняя ошибка API функции была успешно ею же и обработана, встречается это не так уж и редко. А вообще-то такая "псевдоошибка" долго висеть пока не затрётся настоящей.
Не всегда. Сама SQLConfigDataSource вызывает, я думаю, ещё очень много других функций. Ну вот, например, кусок некой функции: Код (Text): HMODULE hLib=LoadLibrary("123.dll"); if(hLib!=INVALID_HANDLE_VALUE) { ... } else { ... } Если 123.dll не будет найдена, то в LAST_ERROR будет ERROR_MODULE_NOT_FOUND, но сама функция выполнится корректно. Поэтому правильнее писать: Код (Text): rst = SQLConfigDataSource(NULL, ODBC_ADD_DSN, TEXT("Microsoft Access Driver (*.mdb)"),TEXT ("CREATE_DB=c:\\log_database.mdb General\0")); if(!rst) { err = GetLastError(); static char msgBuf[256]; FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, 0, msgBuf, sizeof msgBuf, NULL) ; return 1; } return 0;