- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在 Visual Studio 2015/VC++ 上使用 IBPP。 IBPP 是 firebird/interbase API 的 c++ 包装器。 IBPP, a C++ Client Interface to Firebird Server
这个包的一部分是一个小测试套件,你可以在这里下载: ibpp-2-5-3-1-src.zip
从测试套件开始,你会发现一个简单的批处理文件来编译它
x:...\ibpp-2-5-3-1-src\tests\vs2005\simplest-build.bat
它使用 vc++ 2015 的原生 x86 和 x64 工具链编译良好。
在编译之前你需要编辑第84到86行
x:...\ibpp-2-5-3-1-src\tests\tests.cpp
const char* DbName = "x:/ibpptest/test.fdb"; // FDB extension (GDB is hacked by Windows Me/XP "System Restore")
const char* BkName = "x:/ibpptest/test.fbk";
const std::string ServerName = ""; //"localhost"; // Change to "" for local protocol / embedded
请注意创建目录x:\ibpptest\
。
此外,您需要下载 fblient 文件,这些文件本身不可用,但作为整个服务器存档的一部分。获取这两个文件: 32-bit Embedded和 64-bit Embedded.
为了简化,除了 x:\...\ibpp-2-5-3-1-src\tests\vs2005\
之外还创建了两个目录:
x:\...\ibpp-2-5-3-1-src\tests\vs2015x86\
x:\...\ibpp-2-5-3-1-src\tests\vs2015x84\
并将 x:\...\ibpp-2-5-3-1-src\tests\vs2005\simplest-build.bat
复制到其中。现在将 fbclient 文件(32 位到 x86,64 位到 x64)复制到这些目录中:
intl/*
udf/*
fbembed.dll
firebird.msg
ib_util.dll
icudt30.dll
icuin30.dll
icuuc30.dll
msvcp80.dll
msvcr80.dll
现在您可以编译并启动tests.exe。 x86 二进制文件在测试 6 中产生了一些错误,这没关系,因为您使用的是 fblient 文件的嵌入式版本。 x64 二进制文件将出现在 Windows 程序失败屏幕中。当测试套件激活异常时,这发生在 Test3 中:
try
{
#if defined(IBPP_WINDOWS) && defined(_DEBUG)
OutputDebugString(_("An exception will now get logged in the debugger: this is expected.\n"));
#endif
st1->ExecuteImmediate( "CREATE SYNTAX ERROR(X, Y) AS "
"SELECT ERRONEOUS FROM MUSTFAIL M" );
}
catch(IBPP::SQLException& e)
{
//~ std::cout<< e.what();
if (e.EngineCode() != 335544569)
{
_Success = false;
printf(_("The error code returned by the engine during a\n"
"voluntary statement syntax error is unexpected.\n"));
}
}
在 x86 二进制文件中,此异常按预期被捕获,但在 x64 二进制文件中则不会。有人知道如何在 x64 二进制文件中实现类似的异常处理吗?
在此先感谢您的帮助!
最佳答案
警告:我使用 Visual Studio 2017 环境运行最简单的 build.bat 文件。
从我在下面提供的证据看来,导致此问题的 Firebird 服务的 32 位和 64 位版本之间存在 fork 或其他编译差异。
解决方案:EngineCode() 成员函数在 64 位版本中不存在。您必须使用异常的 what() 成员函数,如 Test3() catch block 内注释掉的行所示。如果您希望使用 EngineCode 信息,您将不得不从 what() 字符串中解析它,因为它包含最初作为 32 位 IBPP::SQLExceptionImpl 类中的单独数据成员提供的所有信息。
try
{
#if defined(IBPP_WINDOWS) && defined(_DEBUG)
OutputDebugString(_("An exception will now get logged in the debugger: this is expected.\n"));
#endif
st1->ExecuteImmediate( "CREATE SYNTAX ERROR(X, Y) AS "
"SELECT ERRONEOUS FROM MUSTFAIL M" );
}
catch(IBPP::SQLException& e)
{
//~ std::cout<< e.what();
printf(e.what());
//if (e.EngineCode() != 335544569)
//{
// _Success = false;
// printf(_("The error code returned by the engine during a\n"
// "voluntary statement syntax error is unexpected.\n"));
//}
}
what() 调用的结果。
*** IBPP::SQLException ***
Context: Statement::ExecuteImmediate( CREATE SYNTAX ERROR(X, Y) AS SELECT ERRONEOUS FROM MUSTFAIL M )
Message: isc_dsql_execute_immediate failed
SQL Message : -104
can't format message 13:896 -- message file C:\WINDOWS\SYSTEM32\firebird.msg not found
Engine Code : 335544569
Engine Message :
Dynamic SQL Error
SQL error code = -104
Token unknown - line 1, column 8
SYNTAX
谜题:statement.cpp 展示了IBPP::SQLExceptionImpl 和其他...ExceptionImpl 的用法,所以我不得不相信这个源代码是32 位分支。如果这应该是 32 位和 64 位的公共(public)分支,那么我看不出它是如何工作的。
有两个定义异常类的头文件。我相信 _ibbp.h 用于编译 32 位客户端,而 ibbp.h 用于 64 位客户端。我通过更改 Test3() 中的 catch 子句以查看可能发生的异常情况得出了这些结论。 ...ExceptionImpl 类只能使用 32 位客户端 dll 进行编译,而不能使用 64 位 dll 进行编译。
来自 _ibpp.h(32 位 fbclient dll 识别这些类。64 位 fbclient dll 不识别。)
///////////////////////////////////////////////////////////////////////////////
//
// Implementation of the "hidden" classes associated with their public
// counterparts. Their private data and methods can freely change without
// breaking the compatibility of the DLL. If they receive new public methods,
// and those methods are reflected in the public class, then the compatibility
// is broken.
//
///////////////////////////////////////////////////////////////////////////////
//
// Hidden implementation of Exception classes.
//
/*
std::exception
|
IBPP::Exception
/ \
/ \
IBPP::LogicException ExceptionBase IBPP::SQLException
| \ / | \ /
| LogicExceptionImpl | SQLExceptionImpl
| |
IBPP::WrongType |
\ |
IBPP::WrongTypeImpl
*/
来自 ibpp.h(两个 fbclient dll 集都识别这些类)
/* IBPP never return any error codes. It throws exceptions.
* On database engine reported errors, an IBPP::SQLException is thrown.
* In all other cases, IBPP throws IBPP::LogicException.
* Also note that the runtime and the language might also throw exceptions
* while executing some IBPP methods. A failing new operator will throw
* std::bad_alloc, IBPP does nothing to alter the standard behaviour.
*
* std::exception
* |
* IBPP::Exception
* / \
* IBPP::LogicException IBPP::SQLException
* |
* IBPP::WrongType
*/
在所有的 tests.cpp 中,IBPP::SQLException 的唯一捕获是在 Test3() 中。其他所有捕获都使用 IBPP::Exception。
所以这个问题只会在为 64 位编译时出现在 Test3() 中,但我认为只要在 64 位实现中使用 IBPP::SQLException,它就会出现。
关于c++ - IBPP/Firebird 客户端的 VC++ 异常处理在 x86 和 x64 上不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42889781/
当应用程序启动时,您将从 ViewController(中间的那个)开始。从那里我在右边添加了 VC。当用户点击此 VC 上的按钮时,我希望该 View 消失(我目前只需将其框架更改为 900 即可实
我在 Xcode 7 中使用简单的主/详细信息分割 View 模板,并希望用户从具有主要类别的高级 Master VC 开始,然后选择一个并深入到各个项目 - 仍然在左侧- 然后当他们从第二个主 VC
我有一个名为“firstVC”的 View Controller 和另一个名为“secondVC”的 View Controller 。第二个 VC 将以模态方式呈现在第一个 VC 上,当用户按下第二
我被困在一个问题上,我有一个案例 我有一个父 VC 它有2个容器[childVC A, childVC B] API 正在调用 childVC (UIViewController) A 一旦 chil
我从呈现的 VC 导航到 VC(让我们调用 VC A)。在 VC A 中,我有一个容器 View ,它有一个 VC(让我们调用 VC B)。从 VC B 我提出了另一个 VC(我们称之为 VC C)。
我有一个主 VC(称为 VC A),它有一个子 VC(VC B)。当我点击 VC B 上的按钮时,我将其作为子 VC 关闭,但是一旦完成,我想实例化另一个 VC(VC C)。我通过在 VC B 上创建
我们正在寻求改变用户退出我们应用程序的方式。为了做到这一点,我们要关闭当前 VC 下面的所有 VC,并将另一个 VC 作为根 VC。现在我们正在这样做,我相信这不会从内存中消除下面的任何 VC。 le
我仅使用 segue 在我的应用程序中导航。 我只是想知道,如果我从 1st-VC 导航到 V2,再到 V3,然后再到 4th-VC,如何直接从 4th-VC 导航回 1st VC,而不返回到 V3、
最新的 Xcode/Swift/iOS。 我有一个主 VC(称为 StartVC),其中包含一个子 VC(称为 TopBarVC)via 和嵌入式 segue。子 VC 包含一个按钮,按下该按钮时,会
我试图将从 map 中获得的地址传递到我的其他 View Controller 中并保持相同的设置(即开关仍然打开) mapVC 名为 MapViewController,tableVC 名为 Add
我有一个嵌入在 navigationcontroller 中的 viewcontroller,它将另一个 viewcontroller 推送到堆栈上。这个推送的 View Controller 有一个
昨天更新后,我在 iPad 上遇到了这个问题:如果我加载第二个 View Controller ,它看起来比第一个 View Controller 小(见下图)。有趣的是,自从我在 iPad 上更新了
我的项目有这样的设计: VC1 ---firstSegue----> VC2 ---secondSegue---> VC3 通过使用协议(protocol)/委托(delegate)方法,我可以毫无问
图像不是从一个 VC 到另一个 VC。 问题是将它显示到主 UIViewController 中的 ImageView 。我已将所有内容正确连接到 Storyboard中。 点击here查看我的 St
如何在vc++中调用vc++dll。 在.h文件中 typedef int (*LPVAR)(char * ptr_f, char *CC); HINSTANCE hDLL; 在.cpp 文件中 hD
当我从 VC1 转到 VC2 时,如果 VC2 被解雇,我可以通过在 VC2 中设置协议(protocol)并让 VC1 符合它,轻松地将数据传回 VC1。我想做类似的事情,但有以下区别 当我从 VC
我有一个 VC(A),它有一个容器 View 并根据 segementControl 值更改它的 VC(B-C),我在 A ViewController 中发送请求并获得响应,我想确保 B 和C Vi
所以我在我的应用程序中实现了通用链接,当按下按钮时,我打开了我的第二个应用程序: UIApplication.shared.open(aUrl!) 我也接到了电话: func application(
我想在 ios 中模拟联系人列表。当点击 + 按钮添加联系人时,会出现一个新的 View Controller ,为您提供文本字段以输入联系人姓名和用于保存该联系人的其他信息。一旦你点击完成按钮,下一
我有两个 ViewControllers - Slider 和 Foo。我将 Slider 添加为 Foo subview 并将其框架设置在 Foo VC 中,但是 Slider 的框架没有改变 ->
我是一名优秀的程序员,十分优秀!