Приложение OCCI аварийно завершает работу при запуске в режиме отладки в Visual Studio 2005

0

Я пытаюсь создать среду разработки и запустить для разработки приложений с Oracle C++ Call Interface (OCCI) в Visual Studio 2005.

Мои системные спецификации: ОС: Windows 7, 64-разрядный Oracle: 11g release 11.2.0.2, 32-разрядный Instant Client: BasicLite и SDK версии 11.2.0.4 32-разрядная версия Visual Studio 2005 Professional Edition версии 8.0 с включенными 32-разрядными инструментами

Я следил за этим руководством Марк Уильямс, и я получил пример, но только в режиме выпуска. Когда я переключаюсь в режим отладки, приложение будет строить, но когда я запустил его, я получаю следующую ошибку:

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 как для версии выпуска, так и для отладки.

У меня заканчиваются идеи о том, как приступить к решению этой проблемы, и я был бы очень признателен за любую помощь.

Теги:
occi
visual-studio-2005

3 ответа

0

У меня есть проблема, связанная с тем, что я успешно использую oraocci12d.dll/msvcr100d.dll, но это, в свою очередь, использует oci.dll/msvcr100.dll. т.е. oci.dll не использует отладочную версию msvcr100.

Моя программа, похоже, работает нормально, но при выходе из системы исчезает сообщение об утечке памяти.

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 чтобы исполняемый файл мог найти oci.dll. Я просто упоминаю об ошибках в случае, если кто-то другой столкнется с ними.

Вот что нужно, чтобы заставить его работать:

Прежде всего, Instant Client не содержит oraocci11d.lib или oraocci11d.dll, поэтому необходимо установить полный клиент Oracle.

Затем в 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

На странице свойств вашего проекта в разделе "Свойства конфигурации" → "Линкер" выберите "Enter" и "Дополнительные зависимости" добавьте oraocci11d.lib (или oraocci11.lib для режима выпуска). Затем выберите режим отладки/выпуска в Configuration Manager

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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню