我正在尝试使用Visual Studio 2005中的Oracle C ++调用接口(OCCI)开发和运行开发环境。
我的系统规格如下: 操作系统:Windows 7,64位 Oracle:11g版本11.2.0.2,32位 Instant Client:BasicLite和SDK版本11.2.0.4 32位 启用了32位工具的Visual Studio 2005 Professional Edition 8.0版
我已经关注了this guide by 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作为发行版和调试版。
我已经没有关于如何解决这个问题的想法,我将非常感谢任何和所有的帮助。
答案 0 :(得分:0)
如果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.
答案 1 :(得分:0)
由于我花了相当长的时间才使调试环境正常工作,我想我现在回答了自己的问题。
在整个考验过程中我遇到了各种各样的错误,但我最常遇到的错误是错误说:
'应用程序无法正确启动(0xc0150002)。 单击“确定”关闭应用程序。
另外,我使用http://www.dependencywalker.com反复告诉我oraocci11d.dll
或dll's
的{{1}}列表无法找到。
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中,选择“工具” - &gt;选项,展开“项目和解决方案”并选择VC ++目录。在'显示目录'下:
C:\Program Files\Oracle\11.2.0\OCI\include
C:\Program Files\Oracle\11.2.0\OCI\lib\MSVC\vc8
在配置属性下的项目属性页面 - &gt;链接器选择输入并在其他依赖项下添加oraocci11d.lib
(或oraocci11.lib
用于发布模式)。然后在Configuration Manager中选择调试/发布模式
答案 2 :(得分:0)
我有一个相关的问题,我成功使用了oraocci12d.dll / msvcr100d.dll,但这又使用了oci.dll / msvcr100.dll 。即,oci.dll没有使用msvcr100的调试版本。
我的程序似乎运行正常,但任何内存泄漏报告在退出时都会消失。