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