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