簡體   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