QPluginLoaderクラスは、QByteArrayからQtプラグインをロードするためのメソッドを提供しません。QByteArrayからプラグインをロードするにはどうすればよいですか?
私の場合、プラグインはstdinを介してプログラムに送信されます。そのため、ファイルとしては利用できません。
QPluginLoaderクラスは、QByteArrayからQtプラグインをロードするためのメソッドを提供しません。QByteArrayからプラグインをロードするにはどうすればよいですか?
私の場合、プラグインはstdinを介してプログラムに送信されます。そのため、ファイルとしては利用できません。
最初にQByteArrayをQTemporaryFileに保存してから、QPluginLoaderでロードできます。
void load_plugin_from_bytearray(const QByteArray &array) {
QTemporaryFile file;
file.setPermissions(QFile::ReadOwner | QFile::WriteOwner | QFile::ExeOwner);
if (file.open()) {
qint64 bytes_written = file.write(array);
if (bytes_written != array.size()) {
throw std::runtime_error("Writing to temporary file failed");
}
} else {
throw std::runtime_error("Could not open temporary file");
}
QPluginLoader loader(file.fileName());
QObject *plugin = loader.instance();
if (plugin) {
do_something_with_plugin(plugin);
} else {
throw std::runtime_error(loader.errorString().toStdString());
}
}
残念ながら、複数のプラグインがあり、関数load_plugin_from_bytearrayを複数回実行する必要がある場合、これは機能しない可能性があります。QTemporaryFileが一時ファイルに同じファイルパスを再利用し、QPluginLoaderがロードされたプラグインをキャッシュしているためです。これをもっと調査する必要があります。templateName
とにかく、 QTemporaryFileごとに異なるものを提供することで一時ファイルのパスを一意にすることで、この問題を回避できます。
QTemporaryFile::QTemporaryFile(const QString & templateName)