运行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。