运行Visual Studio,点击左上角【文件(F)】->【新建(N)】->【项目(P)】,VS将弹出如下对话框:
我们选择上图中选中的(MFC DLL)模板,在【名称(N)】文本栏键入我们的项目名(Extended),点击确定。在后续弹出的对话框选择【下一步>】,出现如下所示图:
我们选择【MFC 扩展DLL(E)】,单击【完成】。
在VS的【解决方案资源管理器】中右键我们新建的项目,在弹出的对话框中我们选择【 属性(R) 】项。VS将弹出如下设置框:
根据我们的需要设置相应的属性,在此实例中,我们使用的DEBUG配置,X86平台,读者应根据自己所需在对话框作出如下修改:
Release/64 | Release/32 | Debug/64 | Debug/32 | |
输出目录 | 控件\Bin\vc100x64 | 控件\Bin\vc100 | 控件\Bin\vc100x64d | 控件\Bin\vc100d |
目标文件名 | $(ProjectName)52x64 | $(ProjectName)52 | $(ProjectName)52x64d | $(ProjectName)52d |
在【目标文件扩展名】栏我们修改为".mrx",而在【VC++目录】下我们需要作出如下修改:
只需要修改【包含目录】和【库目录】,或者修改:
【包含目录】的设置应用到【C/C++】->【常规】下的【附加包含目录】
【库目录】的设置应用到【连接器】->【常规】下的【附加库目录】
前者于后者都是将CAD控件下的头文件与lib文件引用到项目,而区别在于是否仅适用于当前工程。
在【解决方案】下右键我们的【Extended】,选择【添加(D)】->【类(C)】->【C++类】,取名为“CommandTest”。
在“CommandTest”的头文件里定义如下:
#pragma once class CommandTest { public: static void RegisterCommand(); static void UnRegisterCommand(); private: static void AddCommand(); };
而CommandTest”的源文件里定义如下:
#include "StdAfx.h" #include "CommandTest.h" void CommandTest::RegisterCommand(){ acedRegCmds->addCommand(_T("CommandTest"), _T("AddCommand"), _T("AddCommand"), ACRX_CMD_MODAL, AddCommand); } void CommandTest::UnRegisterCommand() { acedRegCmds->removeGroup(_T("CommandTest")); } void CommandTest::AddCommand() { }
在头文件里的RegisterCommand函数是将我们的自定义命令(此实例仅有一个AddCommand作为演示)添加到命令表中,而UnRegisterCommand则是注销命令。
在代码预编译头文件(stdafx.h)中添加如下 CAD控件\Src\MxDraw5.2\MxInc\MxDraw.h 头文件。
#include "..\..\MxDraw52\Src\MxDraw5.2\MxInc\mxdraw.h"
在dllmain.cpp中,我们将设置导出函数:
声明:
extern "C" _declspec(dllexport) McRx::AppRetCode mcrxEntryPoint( McRx::AppMsgCode msg, void* pkt);
实现:
extern "C" McRx::AppRetCode mcrxEntryPoint( McRx::AppMsgCode msg, void* pkt) { switch( msg ) { case McRx::kInitAppMsg: mcrxDynamicLinker->unlockApplication(pkt); initApp(); break; case McRx::kUnloadAppMsg: unloadApp(); break; default: break; } return McRx::kRetOK; }
并添加:
MC_IMPLEMENT_EXTENSION_MODULE(theMrxDLL); HINSTANCE _hdllInstance = NULL;
主函数内为:
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { // 如果使用 lpReserved,请将此移除 UNREFERENCED_PARAMETER(lpReserved); if (dwReason == DLL_PROCESS_ATTACH) { TRACE0("Extended.DLL 正在初始化!\n"); _hdllInstance = hInstance; if(!theMrxDLL.AttachInstance(hInstance) ) return 0; } else if (dwReason == DLL_PROCESS_DETACH) { TRACE0("Extended.DLL 正在终止!\n"); theMrxDLL.DetachInstance(); } return 1; // 确定 }
并添加我们的初始化与注销函数:
void initApp() { CommandTest::RegisterCommand(); } void unloadApp() { CommandTest::UnRegisterCommand(); }
我们需要在调用此扩展程序的项目下添加如下代码:
Mx::mcrxLoadModule(_T("Extended"), false);
我们将使用我们控件里的演示程序【Edit.exe】进行添加扩展程序【Extended.mrx】;启动调试【Edit.exe】或者设置“Extended”项目下的【调试】->【命令】项为 CAD控件\Bin\vc100d\Edit.exe。
添加
更多的实例代码在 CAD控件\Src\MxDraw5.2\samples下可找到。 如MxEdit。