给Windows Installer添加Custom Action
Windows Installer的Custom Action可以是exe, dll, vbs或js文件。
通过这个Custom Action,只要有足够的权限,基本上想做什么就做什么。
用C++编写Custom Action的例子(省略建各种工程的步骤):
1.EXE
(1).C++代码,Console Application。其中可以通过MsiDoAction调用一些别的Action。目前并没有了解。
通常通过Windows Installer 的Property来进行数据共享。
2 #include <Msiquery.h>
3 #include <stdio.h>
4 #pragma comment(lib, "msi.lib")
5
6 int main(int argc, char *argv[])
7 {
8 printf("This is a custom action");
9 getchar();
10 //MsiOpenPackage();
11 //MsiDoAction();
12 //MsiCloseHandle();
13 return ERROR_SUCCESS;
14 }
(2).在部署项目的File System View中新建一个文件夹,并将此exe添加到该文件夹中。
(3).在Custom Actions View中添加Custom Action,选择该exe。
也可以将这多个项目集中到一个解决方案中,通过添加项目的Primary Output来进行添加。
在exe文件中,是无法获取当前installer的session的,只能通过DLL或script来操作当前installer,参考[4]。
2.DLL
(1)新建一个空的DLL项目。添加如下代码
2 {
3 #include <windows.h>
4 #include <msi.h>
5 #include <Msiquery.h>
6 #pragma comment(lib, "msi.lib")
7
8 __declspec(dllexport) UINT __stdcall FirstAction(MSIHANDLE hInstall)
9 {
10 MessageBox(0, TEXT("message"), TEXT("caption"), MB_OK);
11 return ERROR_SUCCESS;
12 }
13 };
(2)将此DLL添加到CustomAction,然后在EntryPoint指定为FirstAction。
最初的代码根据[7]编写,原文手工编写了def文件,我使用了dllexport省去了这一步,但是原文没有加extern,导致找不到FirstAction。
然后发现[6]中有这样一个Note:
For DLLs created using Visual C++, entry points must be defined using the extern keyword in order to be visible to Windows Installer. For more information, see Using extern to Specify Linkage.
参考:
1.Visual Studio Setup - projects and custom actions
2.Walkthrough: Creating a Custom Action
4.Accessing the Current Installer Session from Inside a Custom Action
6.Unspecified module entry point for custom action '<name>'
7.http://www.flexerasoftware.com/webdocuments/PDF/dlls-for-ipwi.pdf