1

QPluginLoaderクラスは、QByteArrayからQtプラグインをロードするためのメソッドを提供しません。QByteArrayからプラグインをロードするにはどうすればよいですか?

私の場合、プラグインはstdinを介してプログラムに送信されます。そのため、ファイルとしては利用できません。

4

1 に答える 1

2

最初に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)

于 2013-02-12T10:43:32.403 に答える