现象
Firebird 数据库表中字段类型为 Float,使用 IBPP set() 函数使用 double 类型设置 Prepared Statement 中对应的 Parameter 时发生错误。因运行时无法看到错误信息,虽然记录不能插入表,但程序也不总是在这个时候崩溃,因此这个问题相当隐蔽。
Still waters run deep.
Firebird 数据库表中字段类型为 Float,使用 IBPP set() 函数使用 double 类型设置 Prepared Statement 中对应的 Parameter 时发生错误。因运行时无法看到错误信息,虽然记录不能插入表,但程序也不总是在这个时候崩溃,因此这个问题相当隐蔽。
wxWidgets 与 IBPP 一同使用(连接 wxWidgets 库)时,
make -f makefile.gcc all g++.exe -c -o MinGWUnicodeDebug/all_in_one.o -fno-rtti -fno-pcc-struct-return -fstrict-aliasing -Wall -Wno-write-strings -D__WXMSW__ -D__GNUWIN32__ -D__WIN95__ -DUNICODE -D__WXDEBUG__ -ggdb -O0 -Wall -Wno-write-strings -I"C:/wx/include" -I"C:/wx/contrib/include" -I"C:/wx/lib/gcc_lib/mswud" ibpp\core\all_in_one.cpp In file included from ibpp\core\all_in_one.cpp:35: ibpp\core\_ibpp.cpp: In member function `ibpp_internals::GDS* ibpp_internals::GDS::Call()': ibpp\core\_ibpp.cpp:142: error: cannot convert `const char*' to `const WCHAR*' for argument `1' to `HINSTANCE__* LoadLibraryW(const WCHAR*)' ibpp\core\_ibpp.cpp:162: error: cannot convert `char*' to `WCHAR*' for argument `2' to `DWORD GetModuleFileNameW(HINSTANCE__*, WCHAR*, DWORD)' ibpp\core\_ibpp.cpp:170: error: cannot convert `char*' to `WCHAR*' for argument `1' to `WCHAR* lstrcatW(WCHAR*, const WCHAR*)' ... ...
针对第二种情况,不使用 wxWidgets 的编译选项 -fno-rtti,重新编译 IBPP(all_in_one.cpp)。
即在 Makefile 里把下面一行:
CPPFLAGS= -fno-rtti -fno-pcc-struct-return -fstrict-aliasing -Wall -Wno-write-strings -D__WXMSW__ -D__GNUWIN32__ -D__WIN95__
改为
CPPFLAGS=-fno-pcc-struct-return -fstrict-aliasing -Wall -Wno-write-strings -D__WXMSW__ -D__GNUWIN32__ -D__WIN95__
故障消除。