一步步学习MDL[1]
第一章、建立一个最简单的MDL应用程序
本章将带领您从零开始一步步建立一个最简单的Hello World本机代码MDL应用程序,该程序能够在Mstn中装载运行。
1、在任一驱动器上建立文件夹\MDLSource\HelloWorld,我是在D:上建立的;
2、启动一个文本编辑器(当然可以启动VS2005用作编辑器),在其中键入如下内容并保存为文件D:\MDLSource\HelloWorld\HelloWorld.cpp。该文件中含有程序的入口点函数MdlMain,当应用程序被装载后会从该入口点开始执行。我们在该函数中调用了MDL C API函数mdlDialog_dmsgsPrint用以弹出一个消息框显示Hello World字样。
/*-------------------------------------------------------------+
|
HelloWorld.cpp
| +-------------------------------------------------------------*/
#include <MicroStationAPI.h>
#include <msdialog.fdf>
extern "C" DLLEXPORT int MdlMain (int argc, char *argv[])
{
mdlDialog_dmsgsPrint ("Hello World");
return 0;
}
3、在文本编辑器中键入如下内容并保存为文件D:\MDLSource\HelloWorld\HelloWorld.r。该文件中定义了DllMdlApp资源,该资源的作用是将MA(实际上不是MA文件名而是任务标识符)与指定的DLL文件关联起来。
#include <rscdefs.h>
#define DLLAPP_PRIMARY 1
DllMdlApp DLLAPP_PRIMARY =
{ "HELLOWORLD", "HelloWorld" // taskid, dllName
}
4、将如下内容复制并粘贴成一个叫做HelloWorld.mke的文件保存到D:\MDLSource\HelloWorld下。该文件是生成项目的控制文件。在项目生成过程中,bmake读取该文件的内容然后调用相应的编译器和链接器从源文件生成最终的MA和DLL。上一章的图片显示了这一项目生成过程。
#--------------------------------------------------------------------------------------
# $Source: HelloWorld.mke
#--------------------------------------------------------------------------------------
appName = HelloWorld
Objects = $(o)$(appName)$(oext)
appRscs = $(o)$(appName).rsc
baseDir = $(_MakeFilePath)
%include mdl.mki
dirToSearch = $(MSMDE)/mdl/MicroStationAPI
%include cincapnd.mki
#----------------------------------------------------------------------
# Create needed output directories if they don't exist
#----------------------------------------------------------------------
always:
~mkdir $(o)
~mkdir $(rscObjects)
~mkdir $(reqdObjs)
#----------------------------------------------------------------------
# Define macros for files included in our link and resource merge
#----------------------------------------------------------------------
DLM_NO_SIGN = 1
DLM_OBJECT_DEST = $(o)
DLM_NAME = $(appName)
DLM_OBJECT_FILES = $(appObjects)
DLM_NO_DLS = 1
DLM_NO_DEF = 1
DLM_NOENTRY = 1
DLM_DEST = $(mdlapps)
DLM_NO_DELAYLOAD = 1
DLM_NO_NTBSADDR = 1
DLM_LIBRARY_FILES = $(mdlLibs)BentleyDgn.lib \
$(mdlLibs)toolsubs.lib \
$(mdlLibs)ditemlib.lib \
$(mdlLibs)mdllib.lib
#--------------------------------------------
# Create command table and header file
#--------------------------------------------
#$(baseDir)$(appName)cmd.h : $(baseDir)$(appName)cmd.r
#$(o)$(appName)cmd.rsc : $(baseDir)$(appName)cmd.r
#-----------------------------------------------------------------------
# Generate resource files
#-----------------------------------------------------------------------
$(o)$(appName).rsc : $(baseDir)$(appName).r
#----------------------------------------------------------------------
# Generate MA
#----------------------------------------------------------------------
$(mdlapps)$(appName).ma : $(appRscs)
$(msg)
> $(o)make.opt
-
o$@
$(appRscs)
<
$(RLibCmd) @$(o)make.opt
~time
#-----------------------------------------------------------------------------------------
# Builds any necessary CODE modules and link them to DLL
#-----------------------------------------------------------------------------------------
$(o)$(appName)$(oext) : $(baseDir)$(appName).cpp
%include dlmlink.mki
5、点击“开始 > 所有程序 > Bentley > MicroStation V8i (SELECTseries 3) SDK > MicroStation Developer Shell”启动MDL程序开发环境。在命令提示符后键入CD /D D:\MDLSource\HelloWorld并回车进入我们的项目所在目录,然后再键入bmake –a来生成HelloWorld.ma和HelloWorld.dll。这些生成的文件位于…\MicroStation\mdlapps目录下。
【注意】:如果您的操作系统是中文版,在编译时可能会遇到如下错误提示:
其原因是这个pointcloudApi.h头文件的代码页可能用的是纯英文的。您需要在VS中打开这个头文件,随意增加一个空格后保存即可。
6、启动MicroStation,选菜单Utilities > MDL Applications打开MDL对话框,在该对话框下部的Available Applications列表框中找到并选中HELLOWORLD,然后点按钮Load装载我们的MDL应用程序。此时会看到一个写有Hello World字样的消息框弹出。如下图所示:
7、在您想要重新生成您的HelloWorld项目前需要首先卸载该应用,否则将很可能遇到如图所示的错误提示。卸载方法是在以上MDL对话框上部的Loaded Applications中选中HELLOWORLD,然后点击Unload按钮即可。
【技巧】:还可以通过键入命令来实现MDL应用程序的装载和卸载。选菜单Utilities > Key-in打开键入命令对话框,输入MDL LOAD HelloWorld来装载应用,输入MDL UNLOAD HelloWorld来卸载应用。