我正在尝试在Visual Studio 2005中使用Oracle c++调用接口(OCCI)开发应用程序。
我的系统规格是:操作系统:Windows 7, 64位Oracle: 11g release 11.2.0.2, 32位即时客户端:BasicLite和SDK版本11.2.0.4 32位Visual Studio 2005 Professional Edition version 8.0支持32位工具
我遵循了Mark Williams的这个指南,我得到了这个例子,但是只有在发布模式下运行。当我切换到调试模式,应用程序将构建,但当我运行它,我得到以下错误:
Problem signature:
Problem Event Name: APPCRASH
Application Name: OCCITest.exe
Application Version: 0.0.0.0
Application Timestamp: 53f5dfdd
Fault Module Name: KERNELBASE.dll
Fault Module Version: 6.1.7601.18229
触发此错误的小程序示例如下:
#include "employees.h"
using namespace std;
using namespace oracle::occi;
int main (void)
{
Employees *pEmployees = new Employees();
delete pEmployees;
return 0;
}
Employees::Employees()
{
user = "hr";
passwd = "hr";
db = "localhost:1521/service_name";
env = Environment::createEnvironment(Environment::DEFAULT);
try
{
con = env->createConnection(user, passwd, db);
}
catch (SQLException& ex)
{
cout << ex.getMessage();
exit(EXIT_FAILURE);
}
}
Employees::~Employees()
{
env->terminateConnection (con);
Environment::terminateEnvironment (env);
}
如果我删除所有对OCCI功能的调用,应用程序不会崩溃。也就是说,这个程序运行时没有错误:
#include "employees.h"
using namespace std;
using namespace oracle::occi;
int main (void)
{
Employees *pEmployees = new Employees();
delete pEmployees;
return 0;
}
Employees::Employees()
{
user = "hr";
passwd = "hr";
db = "localhost:1521/service_name";
cout<<"Look at me, I'm running"<<endl;
}
Employees::~Employees()
{}
在指南中Mark提到当在调试模式下运行时,链接器应该使用库文件oraocci11 .lib。但是,这个文件不包括在Instant Client SDK版本11.2.0.4中,所以我使用输入文件oraocci11。库用于发布和调试版本。
对于如何继续解决这个问题,我已经想不出办法了,我将非常感谢任何帮助。
如果Oracle DLL接收和/或传递对象,如std::string
或任何其他对象:
- 以任何方式操作堆,或者
- 应用程序和DLL之间的对象可能有不同的内部结构,
,那么你别无选择,只能使用正确的库来链接。否则就会传递二进制或堆不兼容的对象,从而导致您现在看到的情况。
请看这里:http://docs.oracle.com/cd/E11882_01/appdev.112/e10764/install.htm#CBHGBBJI
上面的链接提到了调试导入库和DLL的调试版本。这也在链接中说明:
Applications that link to MSVCRTD.DLL, a debug version of Microsoft C-Runtime, /MDd compiler flag, should link with these specific OCCI libraries: oraocci11d.lib and oraocci11d.dll.
由于我花了相当多的时间来调试环境,我想我应该回答我自己的问题,现在我做了。
在整个测试过程中,我遇到了各种各样的错误,但最让我困扰的是一个错误:'应用程序无法正确启动(0xc0150002)。单击OK关闭应用程序。'
另外,我使用http://www.dependencywalker.com,反复告诉我oraocci11d.dll
或以下dll's
的列表无法找到。
API-MS-WIN-APPMODEL-RUNTIME-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-ERROR-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-ROBUFFER-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-STRING-L1-1-0.DLL
API-MS-WIN-SHCORE-SCALING-L1-1-1.DLL
DCOMP.DLL
IESHIMS.DLL
然而,真正缺少的是可执行文件能够找到oci.dll
。我只是提一下这些错误,以防别人遇到这些。
下面是使它工作所需的代码:
首先,即时客户端不包含oraocci11d.lib
或oraocci11d.dll
,所以有必要安装完整的Oracle客户端。
接下来,必须在PATH中添加以下内容:
-
C:Program FilesOracle11.2.0OCIlibMSVCvc8
-
C:Program FilesOracle11.2.0BIN
在Visual Studio中,选择"工具->选项",展开"项目和解决方案",选择vc++目录。在"Show directories for"下:
- 添加
C:Program FilesOracle11.2.0OCIinclude
- 添加
C:Program FilesOracle11.2.0OCIlibMSVCvc8
在项目的属性页中,在Configuration Properties -> Linker下选择Input,并在Additional Dependencies下添加oraocci11d.lib
(或oraocci11.lib
用于发布模式)。然后在配置管理器
我有一个相关的问题,因为我成功地使用了oraocci12d.dll/msvcr100.dll,但这反过来又使用了oci.dll/msvcr100.dll。例如,oci.dll没有使用msvcr100的调试版本。
我的程序似乎运行正常,但是任何内存泄漏报告在退出时消失。