繁体   English   中英

在Visual Studio 2005中以调试模式运行时,OCCI应用程序崩溃

[英]OCCI app crashes when running in debug mode in Visual Studio 2005

我试图建立一个开发环境并运行它,以便在Visual Studio 2005中使用Oracle C ++调用接口(OCCI)开发应用程序。

我的系统规格是:操作系统:Windows 7、64位Oracle:11g版本11.2.0.2、32位即时客户端:BasicLite和SDK版本11.2.0.4 32位Visual Studio 2005 Professional Edition 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在指南中提到,在调试模式下运行时,链接器应使用库文件oraocci11d.lib。 但是,此文件未包含在Instant Client SDK版本11.2.0.4中,因此我将输入文件oraocci11.lib用于发行版和调试版。

我没有关于如何解决此问题的想法,我将不胜感激任何帮助。

如果Oracle DLL接收和/或传递诸如std::string对象或以下任何其他对象:

  1. 以任何方式操纵堆,或者
  2. 这些对象在app和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)。 单击确定以关闭应用程序。

另外,我使用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 我只是在提到错误,以防其他人遇到这些错误。

这是使其工作所需的条件:

首先,Instant Client不包含oraocci11d.liboraocci11d.dll ,因此有必要安装完整的Oracle Client。

接下来,必须将以下内容添加到PATH:

  • C:\\Program Files\\Oracle\\11.2.0\\OCI\\lib\\MSVC\\vc8
  • C:\\Program Files\\Oracle\\11.2.0\\BIN

在Visual Studio中,选择“工具”->“选项”,展开“项目和解决方案”,然后选择VC ++目录。 在“显示目录”下:

  • 包含文件添加C:\\Program Files\\Oracle\\11.2.0\\OCI\\include
  • 库文件添加C:\\Program Files\\Oracle\\11.2.0\\OCI\\lib\\MSVC\\vc8

在项目的属性页中的“配置属性”->“链接器”下,选择“输入”,然后在“其他依赖项”下添加oraocci11d.lib (对于发行模式, oraocci11.lib )。 然后在配置管理器中选择调试/发布模式

我有一个相关的问题,就是我可以成功使用oraocci12d.dll / msvcr100d.dll,但是依次使用的是oci.dll / msvcr100.dll 即,oci.dll没有使用msvcr100的调试版本。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM