Здравствуйте, мне надо сделать в WindowsCE работу с базой данных. Я использую API функции типа CeOpenDatabaseEx2, CeCreateDatabaseEx2 и т.д. Вот на таком коде остановился сейчас.
CEDBASEINFOEX ceDBInfo;
CEGUID pceguid;
CEOID ceDB;
HANDLE OpenDB(wchar_t DBName[32])
{
// Формируем имя создаваемой базы
// Получаем хэндл выполняемого модуля
HMODULE hModule = GetModuleHandle(NULL);
// Вытаскиваем имя файла
wchar_t wcFileName[64];
DWORD dwFileNameLen = GetModuleFileName(hModule, wcFileName, 64);
// Ищем где находится последний символ "/"
for(int i=((int)dwFileNameLen-1); i>-1; i--)
if(wcFileName[i] == 0x5c)
dwFileNameLen = i;
// Формируем имя создаваемой базы
for(i=0; i<((int)wcslen(DBName)+1); i++)
wcFileName[i+(int)dwFileNameLen+1] = DBName[i];
// Добавляем расширение
wcFileName[i++] = 0x2e;
wcFileName[i++] = 0x63;
wcFileName[i++] = 0x64;
wcFileName[i++] = 0x62;
wcFileName[i++] = 0x00;
// Создаем ceguid который ни с кем не связан
CREATE_INVALIDGUID(&pceguid);
#ifdef _DEBUG
DWORD dwErr;
#endif
// Монтируем том базы данных
if(!CeMountDBVol(&pceguid,wcFileName,OPEN_ALWAYS))
{
#ifdef _DEBUG
dwErr = GetLastError();
#endif
return INVALID_HANDLE_VALUE;
}
// Обнуляем память, которая хранит информацию о базе
ZeroMemory(&ceDBInfo, sizeof(CEDBASEINFOEX));
// Заносим некоторые параметры
ceDBInfo.wVersion = 1;
ceDBInfo.dwFlags = CEDB_VALIDNAME;
//swprintf(ceDBInfo.szDbaseName, L"%s", wcFileName);
swprintf(ceDBInfo.szDbaseName, L"\\test.cdb", wcFileName);
ceDBInfo.dwSize = sizeof(CEDBASEINFOEX);
ceDB = 0;
// Создаем базу
ceDB = CeCreateDatabaseEx2(&pceguid,&ceDBInfo);
#ifdef _DEBUG
dwErr = GetLastError();
#endif
if(!ceDB && GetLastError() != ERROR_DUP_NAME)
{
#ifdef _DEBUG
dwErr = GetLastError();
#endif
return INVALID_HANDLE_VALUE;
}
// Открываем базу для работы
HANDLE hDB = INVALID_HANDLE_VALUE;
//hDB = CeOpenDatabaseEx2(&pceguid,&ceDB,wcFileName,0,CEDB_AUTOINCREMENT,NULL);
hDB = CeOpenDatabaseEx2(&pceguid,&ceDB,L"\\test.cdb",0,CEDB_AUTOINCREMENT,NULL);
if(hDB == INVALID_HANDLE_VALUE)
{
#ifdef _DEBUG
dwErr = GetLastError();
#endif
return INVALID_HANDLE_VALUE;
}
return hDB;
}
int main(int argc, char *argv[])
{
HANDLE hDB = INVALID_HANDLE_VALUE;
hDB = OpenDB(L"test");
if((HANDLE)hDB != INVALID_HANDLE_VALUE)
printf("DB opened.\n");
else
{
printf("DB NOT opened.\n");
return -1;
}
printf("%d\n" , ceDBInfo.dwNumRecords);
//ceDB = (CEOID)SeekDB(hDB, CEDB_SEEK_BEGINNING, 0);
//if(ceDB == NULL && GetLastError() != ERROR_SEEK)
// return -1;
CEPROPVAL NewProp[2];
NewProp[0].propid = CEVT_I2;
//NewProp[0].wLenData = 0;
//NewProp[0].wFlags = 0;
NewProp[0].val.iVal = 11;
NewProp[1].propid = CEVT_I2;
//NewProp[1].wLenData = 0;
//NewProp[1].wFlags = 0;
NewProp[1].val.iVal = 12;
ceDB = CeWriteRecordProps(hDB, 0, 2, NewProp);
DWORD test = GetLastError();
CloseHandle(hDB);
//CeDeleteDatabaseEx(&pceguid,ceDB);
test = GetLastError();
return 0;
}
Указатель на базу возвращается нормально. Вообще вся функцмя OpenDB нормально работает, без ошибок, а вот после выполения ceDB = CeWriteRecordProps(hDB, 0, 2, NewProp) в переменную test попадает ошибка ERROR_MOD_NOT_FOUND(126). Подскажите, в чем может быть проблема. Может я чего-то не понял в работе с базой?