关于ProjectWise软件的二次开发主要有两个方向。一个方向是开发一个dll程序,嵌入到ProjectWise Explorer中,以达到扩展优化ProjectWise Explorer软件的目的。另一个方向是开发一个独立的应用程序,做为一些小工具供用户使用。
在这一章节,我们将给大家介绍如何使用vs2010开发一个标准的ProjectWise dll程序。下面的例子单纯只是为了演示操作的具体步骤,开发的dll并不具有任何明确的功能。
其中步骤一到步骤六主要介绍如何利用vs2010创建一个MFC dll工程;步骤七到步骤八主要介绍如何将该MFC dll作为一个能嵌入到ProjectWise Explorer中的程序使用;步骤九到步骤十主要介绍如何将开发好的MFC PW dll在ProjectWise Explorer上面运行起来。下面是详细步骤介绍:
第二步:在接下来的MFC DLL向导对话框中,在Application Settings页中选择DLL type为“Regular DLL using shared MFC DLL”,然后点击“Finish”。
第三步:选中项目名称,右键选择“Properties”菜单,在弹出的属性页中,选择Configuration Properties\C/C++\General项,在右侧的各种属性项配置中,找到“Additional include Directories”属性,选中最右侧的下拉按钮,然后点击弹出来的“<Edit…>”。在弹出的Additional Include Directories对话框中,选择右侧第一个“New Line”图标,在新添加的一行中点击这行最右侧的“…”图标。在弹出来的Select Directory对话框中,选择PW SDK安装路径下的include文件夹,然后点击Select Folder”按钮,完成添加工作。添加成功后,在Additional Include Directories对话框中点击“OK”按钮。在Property Pages对话框中选择“OK”或者“Apply”按钮,关于PW的头文件路径就加载完成。
第四步:打开项目中的stdafx.h头文件,在其中加入PW所需的四个头文件,分别为:aaapi.h、aadmsapi.h、aawindms.h、AAWINAPI.H
第五步:选中项目名称,右键选择“Properties”菜单,在弹出的属性页中,选择Configuration Properties\Linker\Input项,在右侧的各种属性项配置中,找到“Additional Dependencies”属性,选中最右侧的下拉按钮,然后点击弹出来的“<Edit…>”。在弹出的Additional Dependencies对话框的输入对话框中添加Pw所需的静态库,分别为:dmawin.lib、dmscli.lib、dmsgen.lib、dmactrl.lib。添加完成后,在Additional Dependencies对话框中,点击“OK”按钮。最后在Property Pages对话框中选择“OK”或者“Apply”按钮。
第六步:选中项目名称,右键选择“Properties”菜单,在弹出的属性页中,选择Configuration Properties\Linker\General项,在右侧的各种属性项配置中,找到“Additional Library Directories”属性,选中最右侧的下拉按钮,然后点击弹出来的“<Edit…>”。在弹出的Additional Library Directories对话框中,选择右侧第一个“New Line”图标,在新添加的一行中点击这行最右侧的“…”图标。在弹出来的Select Directory对话框中,选择PW SDK安装路径下的libwin32文件夹,然后点击Select Folder”按钮,完成添加工作。添加成功后,在Additional Include Directories对话框中点击“OK”按钮。最后在Property Pages对话框中选择“OK”或者“Apply”按钮完成添加工作。
第七步:打开某个.cpp文件,添加一个该动态库的API入口,函数名为:CustomInitialize,函数定义和内容如下面所示:
extern "C" LONG WINAPI CustomInitialize ( ULONG ulMask, // i Application Mask LPVOID lpReserved // i Reserved (must be NULL) ) { static BOOL s_bLoaded = FALSE; if (s_bLoaded) return IDOK; AFX_MANAGE_STATE(AfxGetStaticModuleState()); // do something. s_bLoaded = TRUE; return IDOK; }
第八步:找到后缀为.def的文件,在EXPORTS部分后面加上刚才新添加的API入口函数名(只包括名字)。
第九步:利用PW自带的Custom Module Manager X86工具将开发完了PW DLL嵌入进ProjectWise Explorer中。
第十步:调试测试自己编写的PW DLL时,可通过右键项目名称,选择“Properties”菜单,在弹出的Property Pages对话框中,选择“Configuration Properties\Debugging”,在右侧的属性列表中,找到“Command”项。在这一项的最右侧,选择下拉按钮,然后点击弹出来的“<Edit…>”。在弹出的Command对话框中,输入ProjectWise Explorer实际的安装全路径,然后点击“OK”。最后在Property Pages对话框中点击“OK”或“Apply”按钮完成修改。
此时,在添加的入口函数内部添加一行代码,弹出一个提示对话框,显示的告诉我们编写的DLL是否已经被嵌入到ProjectWise Explorer中。
extern "C" LONG WINAPI CustomInitialize ( ULONG ulMask, // i Application Mask LPVOID lpReserved // i Reserved (must be NULL) ) { static BOOL s_bLoaded = FALSE; if (s_bLoaded) return IDOK; AFX_MANAGE_STATE(AfxGetStaticModuleState()); // do something MessageBox(NULL, L"我们自己创建PW DLL项目已经嵌入进了ProjectWise Explorer客户端", L"一步一步学习PW开发", MB_OK | MB_ICONINFORMATION ); s_bLoaded = TRUE; //g_myKeyBoardHook.Init(); return IDOK; }
代码修改完成后,可点击VS的Debug菜单,选择其中的Start Debugging菜单项开始调试自己的程序。在我们的例子中,开启调试后将首先看到一个对话框提示,此时表示我们编写的PW DLL已成功的嵌入到了ProjectWise Explorer中。
在这一章节,我们将给大家介绍如何使用vs2010开发一个标准的ProjectWise app程序。下面的两个例子单纯只是为了演示操作的具体步骤,开发的app并不具有任何明确的功能。
我们知道ProjectWise SDK中提供的dll都是用C++语言编写的,所以我们开发PW程序时最常见的方式是使用C++语言。不过用户使用C#语言也是可以开发的,这里就需要用到一些通用技术(dllimport 、clr等)来实现用C#语言调用C++的动态库。在1.2.2节我们将给大家介绍如何在C#语言中使用dllimport技术开发PW程序。
其中步骤一到步骤七主要介绍如何利用VS2010创建一个基本的MFC Application项目(包含各种配置);步骤八主要介绍在该Application上实现PW功能需要添加的代码。
第二步:在接下来的MFC Application向导对话框中,在Application Type页中选择Application type为“Dialog base”,然后点击“Finish”。
第三步:选中项目名称,右键选择“Properties”菜单,在弹出的属性页中,选择Configuration Properties\C/C++\General项,在右侧的各种属性项配置中,找到“Additional include Directories”属性,选中最右侧的下拉按钮,然后点击弹出来的“<Edit…>”。在弹出的Additional Include Directories对话框中,选择右侧第一个“New Line”图标,在新添加的一行中点击这行最右侧的“…”图标。在弹出来的Select Directory对话框中,选择PW SDK安装路径下的include文件夹,然后点击Select Folder”按钮,完成添加工作。添加成功后,在Additional Include Directories对话框中点击“OK”按钮。在Property Pages对话框中选择“OK”或者“Apply”按钮,关于PW的头文件路径就加载完成。
第四步:打开项目中的stdafx.h头文件,在其中加入PW所需的四个头文件,分别为:aaapi.h、aadmsapi.h、aawindms.h、AAWINAPI.H
第五步:选中项目名称,右键选择“Properties”菜单,在弹出的属性页中,选择Configuration Properties\Linker\Input项,在右侧的各种属性项配置中,找到“Additional Dependencies”属性,选中最右侧的下拉按钮,然后点击弹出来的“<Edit…>”。在弹出的Additional Dependencies对话框的输入对话框中添加Pw所需的静态库,分别为:dmawin.lib、dmscli.lib、dmsgen.lib、dmactrl.lib。添加完成后,在Additional Dependencies对话框中,点击“OK”按钮。最后在Property Pages对话框中选择“OK”或者“Apply”按钮。
第六步:选中项目名称,右键选择“Properties”菜单,在弹出的属性页中,选择Configuration Properties\Linker\General项,在右侧的各种属性项配置中,找到“Additional Library Directories”属性,选中最右侧的下拉按钮,然后点击弹出来的“<Edit…>”。在弹出的Additional Library Directories对话框中,选择右侧第一个“New Line”图标,在新添加的一行中点击这行最右侧的“…”图标。在弹出来的Select Directory对话框中,选择PW SDK安装路径下的libwin32文件夹,然后点击Select Folder”按钮,完成添加工作。添加成功后,在Additional Include Directories对话框中点击“OK”按钮。最后在Property Pages对话框中选择“OK”或者“Apply”按钮完成添加工作。
第七步:选中项目名称,右键选择“Properties”菜单,在弹出的属性页中,选择Configuration Properties\ General项,在右侧的各种属性项配置中,找到“Output Directory”属性,选中最右侧的下拉按钮,然后点击弹出来的“<Browse…>”。在弹出的OutPut Directory对话框中,选择ProjectWise Explorer安装路径下的bin目录,然后选择“Select Folder”功能完成修改。最后在Property Pages对话框中选择“OK”或者“Apply”按钮完成添加工作。
步骤八:为了能在创建的应用程序中使用PW Explorer API 模块,需要在应用程序运行时添加注册API模块的代码
aaApi_Initialize(AAMODULE_EXPLORER);
该行代码具体添加的位置可选在主窗口对象创建之前。
步骤九:调试运行程序时,可点击VS的Debug菜单,选择其中的Start Debugging菜单项开始调试自己的程序。程序正常运行起来表明一个PW App成功创建。
其中步骤一到步骤三主要介绍如何使用VS2010创建一个Windwos Forms Application项目;步骤四到步骤六主要介绍如何使用C#语言利用dllimport技术调用C++的动态库实现Pw的功能。
第一步:打开VS2010应用程序,选择“New Project…”,在弹出的新建项目对话框中,选择Other Languages\Visual C#\Windows\Windows Forms Application项目,输入项目名称和项目存储位置后,点击“OK”。
第二步:点击项目名称StudyPwFormApp,右键选择”Add”->”Class…”,在弹出的Add New Item对话框中,在右侧选择Visual C# Items\Code\Class,在名称输入框中输入PwWrapper.cs,创建一个叫PwWrapper的新类,最后点击“OK”完成创建。
第三步:点击项目名称StudyPwFormApp,右键选择“Properties“菜单,在弹出的属性配置页中找到Build分类,在Build分类下找到”Output path:”项。点击该项最右侧的”Browser…”按钮,弹出路径选择对话框,在对话框中我们找到ProjectWise 软件安装路径下的bin目录,然后点击“Select Folder”按钮完成添加。
第四步:在PwWrapper.cs类中,首先引用命名空间System.Runtime.InteropServices,然后利用DllImport技术包装Pw 非托管DLL中的函数,以便可以在托管程序中使用非托管DLL中的函数。PwWrapper.cs中的代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; namespace StudyPwFormApp { class PwWrapper { [DllImport("dmscli.dll", CharSet = CharSet.Unicode)] public static extern bool aaApi_Initialize(int init); [DllImport("dmscli.dll", EntryPoint = "aaApi_Login", CharSet = CharSet.Unicode)] public static extern bool aaApi_Login(int iDSType, string lptstrDataSource, string lpctstrUsername, string lpctstrPassword, string lpctstrSchema); } }
在这里我们只包装了两个函数,一个是用于注册Pw SDK模块的aaApi_Initialize(),另一个是用于登陆Pw的aaApi_Login()。
第五步:选择Form1.cs文件,右键选择View Designer菜单。在Vs中选择View菜单,找到里面的Toolbox菜单项,打开工具窗口。我们将一个Button工具添加到已经打开的Form1窗口中,改变该按钮的名字为“确定“,然后双击该按钮,自动生成控件的响应函数。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace StudyPwFormApp { public partial class Form1 : Form { public Form1() { PwWrapper.aaApi_Initialize(1); InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { bool logIsOk = PwWrapper.aaApi_Login(1, "ProjectWise", "projectwise", "p@ssw0rd", ""); if (logIsOk == true) { MessageBox.Show("登陆成功!"); } else { MessageBox.Show("登陆失败!"); } } } }
第七步:调试运行程序时,可点击VS的Debug菜单,选择其中的Start Debugging菜单项开始调试自己的程序。程序正常运行起来后,我们点击“确定“,当弹出”登陆成功!”对话框时,表示我们创建的C# 应用程序成功登陆了ProjectWise。