请注意,我的工作配置是 Centos 5.5 + Oracle XE + Qt4.7
重要的
QxtLogger(或类似的东西)是你最好的朋友。您将无法通过 extproc 调试调用,因此请记录很多。否则将是地狱。(无论如何,这将是地狱,但至少你不会同时被油炸和失明)。注意 Q xt,这是一个不错的库,不是用一些非常有用的东西扩展 Qt 的小库。
DLL缓存
好的,据说当调用 extproc 时,将缓存版本的 DLL 与硬盘驱动器上的缓存版本进行比较,然后加载更新的版本。我发现情况并非总是如此。我不止一次看到我的解析器调用要对旧版本的库进行,而不是在 HDD 上。它会自行修复,只是不会立即修复。记住。
建议:始终将库版本记录到文件中,以确保真正发生了什么。
静态变量
很容易忽略 oracle 在这一点上所说的话(尤其是如果您像我一样对 oracle 缺乏经验,因此几乎所有文档都毫无意义)。不过这很重要。尽管由于上述 dll 缓存,静态函数变量可能会起作用,但不能保证它们会起作用。
例如,这是我们在工作中测试的第一件事:
“制作库,使用静态变量制作 func,进行 2 次后续调用,看到它被保留,愉快地使用 DLL 方法”
这是错误的:(
就在最近,我注意到这些“保留变量”不再保留......并且每次调用花费大约 1 秒从 DB 中“预加载”字典......大声笑。
建议: extproc 调用应该以某种方式调用服务器上已经存在的进程。例如在我的例子中 - 我将解析器库分离为一个始终在服务器上运行的可执行文件和一个通过 QxtRPCPeer 与该进程交换数据的库(在 Qt 应用程序之间传输信号/插槽调用的工具)
默认路径:
是的。尝试调用 qxtLog->debug(QDir::currentPath()); 从 extproc 调用 Dll。这真的不好笑,可能会让您感到沮丧。如果您想在 extproc 调用 的库中使用任何路径依赖项,请确保自己设置路径。
机会是:这个问题也会导致 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 (实际上完成了所有工作)来解决,然后使用没有事件循环的 Godsend 函数 QProcess::waitForFinished()
所以,这些是我的观察。随时纠正我。我很乐意学习正确的方法。