第二章--ProjectWise二次开发的方式


1、如何开发PW程序

关于ProjectWise软件的二次开发主要有两个方向。一个方向是开发一个dll程序,嵌入到ProjectWise Explorer中,以达到扩展优化ProjectWise Explorer软件的目的。另一个方向是开发一个独立的应用程序,做为一些小工具供用户使用。

1.1、开发PW dll

在这一章节,我们将给大家介绍如何使用vs2010开发一个标准的ProjectWise dll程序。下面的例子单纯只是为了演示操作的具体步骤,开发的dll并不具有任何明确的功能。

其中步骤一到步骤六主要介绍如何利用vs2010创建一个MFC dll工程;步骤七到步骤八主要介绍如何将该MFC dll作为一个能嵌入到ProjectWise Explorer中的程序使用;步骤九到步骤十主要介绍如何将开发好的MFC PW 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.

	s_bLoaded = TRUE;
	return IDOK;
}

                         

                         

                         

                         

                         

此时,在添加的入口函数内部添加一行代码,弹出一个提示对话框,显示的告诉我们编写的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中。

                        

1.2、开发PW app

在这一章节,我们将给大家介绍如何使用vs2010开发一个标准的ProjectWise app程序。下面的两个例子单纯只是为了演示操作的具体步骤,开发的app并不具有任何明确的功能。

我们知道ProjectWise SDK中提供的dll都是用C++语言编写的,所以我们开发PW程序时最常见的方式是使用C++语言。不过用户使用C#语言也是可以开发的,这里就需要用到一些通用技术(dllimport 、clr等)来实现用C#语言调用C++的动态库。在1.2.2节我们将给大家介绍如何在C#语言中使用dllimport技术开发PW程序。

1.2.1、C++方式实现

其中步骤一到步骤七主要介绍如何利用VS2010创建一个基本的MFC Application项目(包含各种配置);步骤八主要介绍在该Application上实现PW功能需要添加的代码。

                         

                         

                          

                          

                           

                           

                          

                         

                         

                         

                         

                          

                          

                           

                          

                          

                            

                         

                            

                                                                     aaApi_Initialize(AAMODULE_EXPLORER);

                           该行代码具体添加的位置可选在主窗口对象创建之前。

1.2.2、C#方式实现

其中步骤一到步骤三主要介绍如何使用VS2010创建一个Windwos Forms Application项目;步骤四到步骤六主要介绍如何使用C#语言利用dllimport技术调用C++的动态库实现Pw的功能。

                         

                          

                         

                         

                         

                          

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()。

                         

                          

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("登陆失败!");
            }
        }
    }
}