上次说到:ZW3D 2025起,新增了两个函数ZwPluginLoad和ZwPluginUnload用于加载和卸载另一个插件,可以快速实现插件的加载和卸载。

        而且,ZW3D支持用Windows的命令提示符向ZW3D发送命令

        我们可以利用这两个特性,结合Visual Studio的“生成前事件”和“生成后事件”,实现Visual Studio编译时,ZW3D插件的自动卸载和自动加载功能。

1.制作插件“ZW3DPluginManager”并在ZW3D中加载,用于加载和卸载其他插件

void 卸载dll(const char* dllName)
{
	//卸载Dll
	if (ZF_CALL(ZwPluginUnload(dllName)) == ezwErrors::ZW_API_NO_ERROR)
	{
		WriteMessage("已卸载插件【%s】", dllName);
	}
}

void 加载dll(const char* dllPath)
{
	//加载Dll
	szwPluginData pluginData{};
	ZF_CALL(ZwPluginDataInit(dllPath, &pluginData));
	if (ZF_CALL(ZwPluginLoad(pluginData)) == ezwErrors::ZW_API_NO_ERROR)
	{
		WriteMessage("已加载插件【%s】", dllPath);
	}
}

//入口函数,函数名必须为“项目名”+“Init”,区分大小写
// Entry function, which must be named as "Project name" + "Init" ,case sensitive
extern "C" _declspec(dllexport) int ZW3DPluginManagerInit(int format, void* data)
{
	ZF_CALL(cvxCmdFunc("卸载dll", 卸载dll, VX_CODE_GENERAL));
	ZF_CALL(cvxCmdFunc("加载dll", 加载dll, VX_CODE_GENERAL));
	return 0;
}

//出口函数,函数名必须为“项目名”+“Exit”,区分大小写
// Exit function, which must be named as "Project name" + "Exit" ,case sensitive
extern "C" _declspec(dllexport) int ZW3DPluginManagerExit(void)
{
	ZF_CALL(cvxCmdFuncUnload("卸载dll"));
	ZF_CALL(cvxCmdFuncUnload("加载dll"));
	return 0;
}

编译并在ZW3D中加载“ZW3DPluginManager.dll”

2.制作插件“HelloZW3D”并在ZW3D中加载

//入口函数,函数名必须为“项目名”+“Init”,区分大小写
// Entry function, which must be named as "Project name" + "Init" ,case sensitive
extern "C" _declspec(dllexport) int HelloZW3DInit(int format, void* data)
{
	cvxMsgDisp("Hello ZW3D!");
	return 0;
}

//出口函数,函数名必须为“项目名”+“Exit”,区分大小写
// Exit function, which must be named as "Project name" + "Exit" ,case sensitive
extern "C" _declspec(dllexport) int HelloZW3DExit(void)
{
	return 0;
}

重点:

        在Visual Studio中鼠标右击“HelloZW3D”项目>>生成事件>>生成前事件>>输入以下命令:

echo 判断进程是否存在,如果存在则卸载dll
tasklist | find /i "zw3d.exe" >nul && "$(ZW3D_DIR)ZW3dRemote.exe" -r local:8000 "~卸载dll($(ProjectName).dll)"

这段命令判断ZW3D进程是否存在,如果存在则向ZW3D发送命令“~卸载dll($(ProjectName).dll)”

        在Visual Studio中鼠标右击“HelloZW3D”项目>>生成事件>>生成后事件>>输入以下命令:

echo 判断进程是否存在,如果存在则加载dll
tasklist | find /i "zw3d.exe" >nul && "$(ZW3D_DIR)ZW3dRemote.exe" -r local:8000 "~加载dll($(TargetDir)$(ProjectName).dll)" || exit 0

这段命令判断ZW3D进程是否存在,如果存在则向ZW3D发送命令“~加载dll($(TargetDir)$(ProjectName).dll)”

        先关闭所有ZW3D>>编译项目“HelloZW3D”>>打开ZW3D,加载"HelloZW3D.dll",确保此时“ZW3DPluginManager.dll”和"HelloZW3D.dll"均已加载。

3.修改“HelloZW3D”项目并编译

//入口函数,函数名必须为“项目名”+“Init”,区分大小写
// Entry function, which must be named as "Project name" + "Init" ,case sensitive
extern "C" _declspec(dllexport) int HelloZW3DInit(int format, void* data)
{
	cvxMsgDisp("Hello ZW3D!");
    cvxMsgDisp("代码已修改!");
	return 0;
}

//出口函数,函数名必须为“项目名”+“Exit”,区分大小写
// Exit function, which must be named as "Project name" + "Exit" ,case sensitive
extern "C" _declspec(dllexport) int HelloZW3DExit(void)
{
	return 0;
}

        在Visual Studio中按F7编译项目,会先执行“生成前事件”,发送“~卸载dll($(ProjectName).dll)”命令到ZW3D以卸载“HelloZW3D.dll”,然后编译项目,编译完成后,执行“生成后事件”,发送“~加载dll($(TargetDir)$(ProjectName).dll)”命令到ZW3D以重新加载“HelloZW3D.dll”

推荐内容
点击阅读全文
Logo

一起探索未来云端世界的核心,云原生技术专区带您领略创新、高效和可扩展的云计算解决方案,引领您在数字化时代的成功之路。

更多推荐