sqlite 3.7.17 を Windows 95対応にしてみた
SQLITE 3.7.17 のWindows 向けライブラリをコンパイルしてみたよ
SQLITE 3.7.14.1 をビルドしてみた
前回作った sqlite3.dll 当然 Visual Studio 2005で作られてるので、Windows 95では非対応エクスポート関数が含まれてるのだけど、これを解決してもデータベースが読めない
トレースしてみたところ、 FileのOpenでこけてる。
よく見たら Windows 9x 非対応の OVERLAPPED を使用してた。
#if SQLITE_OS_WINCE if( seekWinFile(pFile, offset) ){ OSTRACE(("READ file=%p, rc=SQLITE_FULL\n", pFile->h)); return SQLITE_FULL; } while( !osReadFile(pFile->h, pBuf, amt, &nRead, 0) ){ #else memset(&overlapped, 0, sizeof(OVERLAPPED)); overlapped.Offset = (LONG)(offset & 0xffffffff); overlapped.OffsetHigh = (LONG)((offset>>32) & 0x7fffffff); while( !osReadFile(pFile->h, pBuf, amt, &nRead, &overlapped) && osGetLastError()!=ERROR_HANDLE_EOF ){ } |
変更前
if( !isNT() ){ if( seekWinFile(pFile, offset) ){ OSTRACE(("READ file=%p, rc=SQLITE_FULL\n", pFile->h)); return SQLITE_FULL; } } else{ memset(&overlapped, 0, sizeof(OVERLAPPED)); overlapped.Offset = (LONG)(offset & 0xffffffff); overlapped.OffsetHigh = (LONG)((offset>>32) & 0x7fffffff); } while( !osReadFile(pFile->h, pBuf, amt, &nRead, isNT()?(&overlapped):0) && ( !isNT() || osGetLastError()!=ERROR_HANDLE_EOF) ){ |
変更後
#if SQLITE_OS_WINCE rc = seekWinFile(pFile, offset); if( rc==0 ){ #else { #endif #if SQLITE_OS_WINCE |
変更前
if(isNT() || (seekWinFile(pFile, offset)==0)){
#if !SQLITE_OS_WINCE #if !SQLITE_OS_WINCE |
変更後
コンパイル済みバイナリ。
その3 サンプルコードを動かしてみよう
ここのサンプルをちょっといじってみた
#include "stdafx.h" #include <windows.h> //#include <tchar.h> #include "sqlite3.h" #include <stdio.h> typedef int (__cdecl * pOpen)(wchar_t *, sqlite3 **); pOpen sqlite3_open2; // 抽出結果が返るコールバック関数 if(zErrMsg){ |
Win95上でのテスト
C:\sqlitest>sqlitest worker = IKD worker = Maru worker = Nacky C:\sqlitest>sqlitest |
ダウンロード
sqlite3.7.17.2.cab
c++ - SQLite can't open database in Win98 - Stack Overflow
調べてみたら、困ってる人がいた
SQLite - Running on windows 98
何でこんなことやったかというと、もふったーのログ管理を sqlite にしたら もっとコンパクトになるんじゃないかって考えたからなんだな・ω・
Comments