容器進程(QQExternal)

容器進程的意義在於這個進程並沒有指定的功能,他只是負責來加載其他模塊(dll),相對於普通進程的優勢就是,不用單獨去做一個進程,在VS中我們只用關注實現邏輯就好,當需要這個功能單獨運行在一個進程中的時候,我們可以方便的用容器進程去加載他,類似於Windows自帶的rundll功能。但是我們的容器進程可以有更強大的輔助功能,可以提供進程間通信接口,讓多進程編程更加容易。如果關注過QQ的QQExternal進程,就會發現這個進程往往有多個,而且個數不定,這個就是QQ的容器進程,他可能會運行web的模塊也可能是其他插件模塊。

一個簡單的容器進程,非常好實現,一個main函數,解析main參數,因爲對要加載的dll接口參數變成了從命令行傳入。解析命令行參數的dll地址,加載該dll,再將剩餘的參數傳入dll的固定接口。以爲我們是一個容器進程,所以對dll的調用接口有要求,可以固定爲void Start(std::vector<std::string> param); 這樣的,方便傳入多個參數,當然這塊可以根據情況設計,但是其他需要被加載的dll模塊導出的接口需要遵循這同一個規則。

 下面是一個用QT工程實現的基本的容器進程模塊:

#include <QApplication>
#include <QLibrary>
typedef void(*StartFunc)(QStringList param);
int main(int argc, char *argv[])
{
	// 開啓高DPI支持
	QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
	QApplication a(argc, argv);
	QStringList args = QApplication::arguments();
	QString dll = args[1].toUtf8();
	QStringList param;
	for (int i=2; i< args.size(); ++i)
	{
		param << args[i];
	}
	QLibrary lib(dll);
	StartFunc startFunc = (StartFunc)lib.resolve("start");
	if (startFunc)
	{
		startFunc(param);
	}
	return a.exec();
}

需要該容器加載dll,需要導出typedef void(*StartFunc)(QStringList param);該接口供容器啓動時調用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章