0

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

我的系统规格是: 操作系统:Windows 7,64 位 Oracle:11g 版本 11.2.0.2,32 位 Instant Client:BasicLite 和 SDK 版本 11.2.0.4 32 位 Visual Studio 2005 专业版 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 用于发布和调试版本。

我已经没有关于如何继续解决这个问题的想法了,我将非常感谢任何和所有的帮助。

4

3 回答 3

0

如果 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.

于 2014-08-21T15:58:11.433 回答
0

由于我花了相当长的时间让调试环境正常工作,我想我现在应该回答我自己的问题。

在整个磨难过程中我遇到了各种各样的错误,但我最容易陷入的错误是一个错误说:

'应用程序无法正确启动 (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.libor oraocci11d.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

在 Configuration Properties -> Linker 下的项目属性页中,选择 Input 并在 Additional Dependencies 下添加oraocci11d.lib(或oraocci11.lib用于发布模式)。然后在配置管理器中选择调试/发布模式

于 2014-08-27T11:12:57.983 回答
0

我有一个相关的问题,我成功地使用了 oraocci12d.dll/msvcr100d.dll,但这反过来又在使用 oci.dll/ msvcr100.dll。即,oci.dll 没有使用 msvcr100 的调试版本。

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

于 2017-04-24T16:55:13.603 回答