容器进程(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);该接口供容器启动时调用。

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