关于这个问题并没有太多关于那些试图深入研究的问题的信息,因为ppl尝试这个通常在oracle或c ++中都是无能的(例如我是一个完整的oracle noob)。
两者之间的界线是一个真正黑暗和令人沮丧的地区。这篇文章的目的是让它不那么令人沮丧,或者至少不那么黑暗。
我不会在这里讨论与c ++代码的实际链接,因为大多数手册都对此进行了解释。相反,我想讨论一些事情,最有可能造成麻烦。
见下文:
dll缓存
静态变量
默认路径
事件循环
请注意,我只是分享我的经验,而不是提出解决方案,因为我所做的很可能是令人反感的。所以,我欢迎讨论。
答案 0 :(得分:0)
请注意我的工作配置是Centos 5.5 + Oracle XE + Qt4.7
重要强>
QxtLogger(或类似的东西)是你最好的朋友。你将无法通过extproc调试调用,所以log,很多。或者它会是地狱。 (无论如何,这将是地狱,但至少你不会同时被炒和盲目)。注意Q xt ,这是一个非常好的库,不是很少的库扩展Qt与一些非常有用的东西。
Dll缓存
好的,据说当调用extproc时,会将DLL的缓存版本与硬盘驱动器上的缓存版本进行比较,并加载较新的版本。我发现这总是 NOT 。 不止一次,我看到我的解析器调用是在旧版本的库上完成,而不是在HDD上。它修复了自己,而不是立即。请记住。
建议:始终将库版本记录到文件中,以确保实际发生的事情。
静态变量
很容易忽略oracle在这一点上所说的话(特别是如果你和我一样缺乏oracle经验,那么几乎所有文档几乎没有任何意义)。这很重要。虽然静态函数变量可能由于上述dll缓存而起作用,但无法保证可以正常工作。
例如,这是我们在工作中测试的第一件事:
“make library,使用静态变量生成func,进行2次后续调用,看看它是否保存,快乐地使用DLL方法”
这是错误的:(
就在最近我注意到这些“保留变量”不再保留......每次调用花费大约1秒钟来自DB的“预加载”词典...大声笑。
建议: extproc调用应以某种方式调用服务器上已存在的进程。例如在我的情况下 - 我将解析器库分离为一个始终在服务器上运行的可执行文件和一个通过QxtRPCPeer(用于在Qt应用程序之间传输信号/插槽调用的工具)与此过程交换数据的库
默认路径:
烨。尝试调用qxtLog-> debug(QDir :: currentPath());来自extproc调用了Dll。这非常不好笑,可能会让你感到沮丧。如果你想在extproc调用库中使用任何路径depend,请确保自己设置路径。
可能是:此问题还会导致QOCI驱动程序无法从sqldrivers文件夹自动加载。请改用此代码:
QPluginLoader loader("sqldrivers\\qsqlocid4.dll");
qxtLog->trace(loader.fileName());
QObject *plugin = loader.instance();
qxtLog->trace(loader.errorString());
if (!plugin)
return;
QSqlDriverPlugin *sqlPlugin = qobject_cast<QSqlDriverPlugin *>(plugin);
if (!sqlPlugin )
qxtLog->critical("Failed to load plugin");
else
qxtLog->trace("Successfull plugin load");
QSqlDriver * driver = sqlPlugin->create("QOCI");
db = QSqlDatabase::addDatabase(driver, "Connection name");
记录就在那里,以便您可以随时检查应用程序失败的原因;
请注意,在将QDir :: currentPath设置为指向某处后,您只能使用“sqldrivers \ qsqlocid4.dll”之类的内容。
事件循环:
显然 - 没有这种库的事件循环。 QCoreApplication :: instance()也返回NULL,顺便说一下。含义 - 没有信号/插槽调用。想都别想。 Tbh,我真的希望有人向我展示如何在这种情况下正确使用信号。 对于我的任务,我决定调用QProcess(实际上完成所有工作),然后使用天赐函数QProcess :: waitForFinished()无事件循环
所以,这些是我的观察。随意纠正我。我很乐意了解正确的方法。