Я пытаюсь настроить и запустить среду разработки для разработки приложений с помощью 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 как для версии выпуска, так и для версии отладки.
У меня заканчиваются идеи о том, как действовать в решении этой проблемы, и я был бы очень признателен за любую помощь.
Если Oracle DLL получает и / или передает объекты, такие как std::string
или любой другой объект, который:
тогда у вас нет выбора, кроме как использовать правильную библиотеку для связи с. В противном случае вы попадете с двоичными или кучными несовместимыми объектами, которые передаются, что приводит к тому, что вы видите сейчас.
Посмотреть здесь: 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.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
У меня есть проблема, связанная с тем, что я успешно использую oraocci12d.dll / msvcr100d.dll, но это, в свою очередь, использует oci.dll /msvcr100.dll. то есть, oci.dll не использует отладочную версию msvcr100.
Моя программа работает нормально, но все сообщения об утечке памяти исчезают при выходе.