OCCI应用程序在Visual Studio 2005的调试模式下运行时会崩溃



我正在尝试在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或任何其他对象:

  1. 以任何方式操作堆,或者
  2. 应用程序和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.liboraocci11d.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的调试版本。

我的程序似乎运行正常,但是任何内存泄漏报告在退出时消失。

相关内容

  • 没有找到相关文章