开发环境:
安装 VS2019、MFC
安装 BIMBase建模软件2025R1.0_SDK
安装 BIMBase建模软件2025R1.0
新建项目
打开Visual Studio 2019,单击“创建新项目”→“MFC动态链接库 ”
DLL类型:“MFC扩展DLL”

头文件设置
pch.h文件
// pch.h: 这是预编译标头文件。
// 下方列出的文件仅编译一次,提高了将来生成的生成性能。
// 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。
// 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。
// 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。
#ifndef PCH_H
#define PCH_H
// 添加要在此处预编译的标头
#include "framework.h"
#endif //PCH_H
// 图形平台基础数据头文件
#include "BPExportMacros.h"
#include "PKPMExportMacros.h"
#include "P3DDC/P3DDCAPI.h"
#include "P3DGeomObject/P3DGeomObjectPublicAPI.h"
// BIMBase Publish API头文件
#include "JsonCpp/JsonCppAPI.h"
#include "BPBase/BPBaseAPI.h"
#include "BPDisplay/BPDisplayAPI.h"
#include "BPData/BPDataAPI.h"
#include "BPDataCore/BPDataCoreDef.h"
#include "BPDataCore/BPDataCoreAPI.h"
#include "BPDataCore/BPPlacement.h"
#include "BPDataCore/BPDomainDataInitManager.h"
#include "BPDataCore/BPEntitySymbologyEvent.h"
#include "BPInteraction/BPInteractionAPI.h"
#include "BPFrame/BPFrameAPI.h"
#include "BPSolidCore/BPSolidCoreAPI.h"
#include "BPBase/BPPlatformAPI.h"
// 专业平台头文件
#include "TgGe/TgGe.h"
//#include "PBClashDetection/PBClashDetectionAPI.h"
//#include "PBClashDetection/ClashDetection.h"
#include "PBBimCore/PBBimCoreAPI.h"
#include "PBBimCore/PBAxisElement.h"
#include "BPApp/PBBimAppAPI.h"
#include "PBBimCore/PBBimSchemaManager.h"
#include "PBPlatform/PBPlatformAPI.h"
#include "PBBimCore/PBClippingEvent.h"
#include "PBBimUtilities/rapidjson/document.h"
#include "PBBimUtilities/rapidjson/stringbuffer.h"
#include "PBBimUtilities/rapidjson/Writer.h"
#include "BPUIFrameWork/BPUIFrameWorkAPI.h"
#include "BPUIFrameWork/BPUIFrameWorkUtil.h"
#include "BPUIFrameWork/BPNewDockContainer.h"
#include "BPUIFrameWork/BPNewDockManager.h"
#include "BPUIFrameWork/RButtonClickItem.h"
#include "BPUIFrameWork/BPViewRButtonClickListener.h"
#include "BPUIFrameWork/BPViewRButtonClickListenerCenter.h"
#include "BPApp/PBToolSettingManager.h"
#include "PBBimUtilities/PBimsErrExceptionUtil.h"
#include "PBBimTools/PBBimToolsAPI.h"
#include "BPPrimaryElement/BPHatchVardef.h"
#include "BPPrimaryElement/BPPrimaryGeomAPI.h"
#include "BPPrimaryElement/BPHatchDefine.h"
#include "BPPrimaryElement/BPHatch.h"
#include "BPPrimaryElement/BPHatchPattern.h"
#include "BPPrimaryElement/BPHatchPatternManager.h"pch.cpp文件
// pch.cpp: 与预编译标头对应的源文件
#include "pch.h"
// 当使用预编译的头时,需要使用此源文件,编译才能成功。
#pragma comment (lib, "P3DDC.lib")
#pragma comment (lib, "P3DGeomBase.lib")
#pragma comment (lib, "P3DGeomObject.lib")
#pragma comment (lib, "BPDataCore.lib")
#pragma comment (lib, "TgGe.lib")
#pragma comment (lib, "BPPlatform.lib")
#pragma comment (lib, "BPSolidCore.lib")
#pragma comment (lib, "BPDataExt.lib")
#pragma comment (lib, "JsonCpp.lib")
#pragma comment (lib, "BPDrawingCommon.lib")
#pragma comment (lib, "BPUIFrameWork.lib")
#pragma comment (lib, "BPApp.lib")
#pragma comment (lib, "BPApp.lib")
#pragma comment (lib, "BPMaterialConfig.lib")
#pragma comment (lib, "BPDataCore.lib")
#pragma comment (lib, "BPParametricBase.lib")
#pragma comment (lib, "BPPrimaryElement.lib")
#pragma comment (lib, "BPPluginManager.lib")
#pragma comment (lib, "BPCoordInput.lib")
#pragma comment (lib, "BPProjectTree.lib")
#ifdef DEBUG
#pragma comment (lib, "WDUiD.lib")
#else
#pragma comment (lib, "WDUi.lib")
#endif属性设置
VS打开 "属性管理器"→“Release | x64” 上右键 → "添加现有属性表" → 选择SDK示例项目中的 “BimBaseSDK.props” 文件
编译项目测试,没有问题就会生成 "E:\Develop\BIMBase\BIMBase建模软件2025R1.0_SDK V1.6\bin\Release\platform\狼牙.COM.dll"

添加测试命令
新建helloBimbase.cpp
#include "pch.h"
void HelloBIMBase()
{
AfxMessageBox(L"Hello www.狼牙.com");
}
AutoDoRegisterFunctionsBegin
BIMBase::BPToolsManager::registerFun(_T("helloBIMBase"), &HelloBIMBase);
AutoDoRegisterFunctionsEnd修改dllmain.cpp文件,最后编译生成dll
// dllmain.cpp : 定义 DLL 的初始化例程。
//
#include "pch.h"
#include "framework.h"
#include <afxwin.h>
#include <afxdllx.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
static AFX_EXTENSION_MODULE 狼牙COMDLL = { false, nullptr };
#include "BPPluginManager/BPPluginManagerApi.h"
class BPPluginDemo :public BIMBase::Plugin::BPPluginFactory
{
public:
BPPluginDemo() {};
virtual ~BPPluginDemo() {};
protected:
virtual void _onLoadPlugin(CWnd* curMainFrame)
{
// load assembly list defined in *.plugin file
auto vecAssembly = BIMBase::Plugin::BPPluginManager::getInstance().getCurPluginAssmebly();
for (auto& it : vecAssembly)
{
loadPluginAssembly(it);
}
}
virtual void _onUnLoadPlugin(::BIMBase::Core::BPProjectR curProject) {};
virtual void _initPluginInformation(BIMBase::Plugin::PluginInformation& pluginInfomation)
{
pluginInfomation.m_wsPluginDescribe = L"www.狼牙.com";
}
};
static BPPluginDemo _pluginDemo;
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// 如果使用 lpReserved,请将此移除
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("狼牙.COM.DLL 正在初始化!\n");
// 扩展 DLL 一次性初始化
if (!AfxInitExtensionModule(狼牙COMDLL, hInstance))
return 0;
BIMBase::Plugin::BPPluginManager::getInstance().registerPlugin(&_pluginDemo);
// 将此 DLL 插入到资源链中
// 注意: 如果此扩展 DLL 由
// MFC 规则 DLL (如 ActiveX 控件)隐式链接到,
// 而不是由 MFC 应用程序链接到,则需要
// 将此行从 DllMain 中移除并将其放置在一个
// 从此扩展 DLL 导出的单独的函数中。 使用此扩展 DLL 的
// 规则 DLL 然后应显式
// 调用该函数以初始化此扩展 DLL。 否则,
// CDynLinkLibrary 对象不会附加到
// 规则 DLL 的资源链,并将导致严重的
// 问题。
new CDynLinkLibrary(狼牙COMDLL);
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("狼牙.COM.DLL 正在终止!\n");
BIMBase::Plugin::BPPluginManager::getInstance().unRegisterPlugin();
// 在调用析构函数之前终止该库
AfxTermExtensionModule(狼牙COMDLL);
}
return 1; // 确定
}
加载插件
安装SDK时,会自动在C:\ProgramData\PKPM\BIMBase\Plugins\SDK类别\SDK版本号\c++plugin路径下放置一个默认的plugin文件(安装完SDK后,C盘会默认配置,注意有些电脑ProgramData文件夹是隐藏状态),用于插件加载。其中路径里SDK类别为不同类型的软件,如lite/pro/Traffic版本等,lite是指BIMBase建模软件Lite-模型浏览器这款软件;pro是指BIMBase建模软件,例如BIMBase建模软件2024R1.0;Traffic是指交通版建模软件,例如BIMBase建模软件2025R1.0。示例中下载的BIMBase建模软件2025R1.0,所以插件加载在pro这个路径下。SDK版本号,即SDK安装包上所标识版本号。可通过修改plugin配置文件来加载自己的插件。范例中基于的SDK版本号为V1.6,加载具体流程参考
"C:\ProgramData\PKPM\BIMBase\Plugins\Pro\V1.6\c++plugin\SecondDevConfig_TestCPP.plugin"文件修改
<?xml version="1.0" encoding="utf-8"?>
<BIMBasePlugins>
<Plugin>
<!-- 插件名称。标签不可缺少,值不可为空。插件名称要小于128字符-->
<Name>狼牙</Name>
<!-- 插件描述。标签不可缺少,值可以为空-->
<Description>狼牙.com</Description>
<!-- 开发商信息。标签不可缺少,值可为空-->
<VendorId>狼牙.com</VendorId>
<!-- 插件开发标识。标签不可缺少,值不可为空。需要去dev.pkpm.cn申请pluginId-->
<PluginId>d7bef6d7-9dbb-db5d-b5ef-5e35dfdebad7</PluginId>
<!-- 插件研发基于BIMBase的版本,默认不用修改 -->
<PluginSDKVersion>1.6.0</PluginSDKVersion>
<!-- 插件的版本记录。标签不可缺少,值不可为空。格式要求x.x.x,由插件研发者维护,便于管理插件版本-->
<PluginVersion>1.0.0</PluginVersion>
<!-- 插件入口DLL。标签不可缺少,值不可为空。填写入口插件dll全路径-->
<EntryAssembly>E:\Develop\BIMBase\BIMBase建模软件2025R1.0_SDK V1.6\bin\Release\platform\狼牙.COM.dll</EntryAssembly>
<!-- 其他Dll列表。需填写dll全路径。标签可缺少,值可以为空-->
<AssemblyList>
<Assembly></Assembly>
</AssemblyList>
<!-- Schema的路径。标签不可缺少,值可以为空。填写schema文件所在的文件夹路径-->
<SchemaPath></SchemaPath>
<!-- SchemaVersion的版本。标签不可缺少,值可以为空。格式要求x.x,若是不符合规则,插件则加载信息失败-->
<SchemaVersion></SchemaVersion>
<!-- 界面配置文件。标签可缺少,值可以为空。若需要在软件启动界面配置新模块,则需要配置MajorConfig文件(SDK包中有模板),并在此指定全路径-->
<!-- MajorConfig文件命名格式要求:MajorConfig_XXX.xml 前缀MajorConfig + 各自专业名称。-->
<MajorConfig></MajorConfig>
<!-- 加载菜单。标签可缺少,值可以为空。填写菜单dll的全路径-->
<Ribbon></Ribbon>
<!-- 插件作用的模块。标签不可缺少,值不可为空。指定后可在特定模块加载插件。多个使用","隔开,如“电气,BIMBase”,若为All,则作用所有模块-->
<ActionChDomainKeys>All</ActionChDomainKeys>
<!-- 插件加载状态。标签不可缺少,值可为空,空则为false -->
<LoadStatus>true</LoadStatus>
</Plugin>
</BIMBasePlugins>
测试命令
打开软件 → 输入 “HELLOBIMBASE” 命令,弹窗如下窗口
