
ZW3D二次开发_Visual Studio编译前自动卸载dll,编译后自动加载dll
而且,ZW3D支持我们可以利用这两个特性,结合Visual Studio的“生成前事件”和“生成后事件”,实现Visual Studio编译时,ZW3D插件的自动卸载和自动加载功能。
上次说到: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”
更多推荐





所有评论(0)