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

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

Мои системные характеристики:
ОС: Windows 7, 64-битная
Oracle: 11g выпуск 11.2.0.2, 32-разрядная версия
Instant Client: 32-битная версия BasicLite и SDK версии 11.2.0.4
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()
{}

В руководстве Марк упоминает, что при работе в режиме отладки компоновщик должен использовать файл библиотеки oraocci11d.lib. Однако этот файл не включен в Instant Client SDK версии 11.2.0.4, поэтому я использую входной файл oraocci11.lib как для версии выпуска, так и для версии отладки.

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

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.

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

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

0

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

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

0
По вопросам рекламы [email protected]