Implement the advertise part of msiexec.
This commit is contained in:
parent
0bb7b50f3d
commit
1dc308ec59
|
@ -113,6 +113,12 @@ typedef enum tagINSTALLLOGMODE
|
||||||
INSTALLLOGMODE_SHOWDIALOG = (1 << (INSTALLMESSAGE_SHOWDIALOG >> 24))
|
INSTALLLOGMODE_SHOWDIALOG = (1 << (INSTALLMESSAGE_SHOWDIALOG >> 24))
|
||||||
} INSTALLLOGMODE;
|
} INSTALLLOGMODE;
|
||||||
|
|
||||||
|
typedef enum tagADVERTISEFLAGS
|
||||||
|
{
|
||||||
|
ADVERTISEFLAGS_MACHINEASSIGN = 0,
|
||||||
|
ADVERTISEFLAGS_USERASSIGN = 1
|
||||||
|
} ADVERTISEFLAGS;
|
||||||
|
|
||||||
#define MAX_FEATURE_CHARS 38
|
#define MAX_FEATURE_CHARS 38
|
||||||
|
|
||||||
typedef INT (CALLBACK *INSTALLUI_HANDLERA)(LPVOID pvContext, UINT iMessageType,
|
typedef INT (CALLBACK *INSTALLUI_HANDLERA)(LPVOID pvContext, UINT iMessageType,
|
||||||
|
|
|
@ -124,6 +124,7 @@ int main(int argc, char *argv[])
|
||||||
int i;
|
int i;
|
||||||
BOOL FunctionInstall = FALSE;
|
BOOL FunctionInstall = FALSE;
|
||||||
BOOL FunctionRepair = FALSE;
|
BOOL FunctionRepair = FALSE;
|
||||||
|
BOOL FunctionAdvertise = FALSE;
|
||||||
BOOL FunctionDllRegisterServer = FALSE;
|
BOOL FunctionDllRegisterServer = FALSE;
|
||||||
BOOL FunctionDllUnregisterServer = FALSE;
|
BOOL FunctionDllUnregisterServer = FALSE;
|
||||||
|
|
||||||
|
@ -135,9 +136,14 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
DWORD RepairMode = 0;
|
DWORD RepairMode = 0;
|
||||||
|
|
||||||
|
DWORD AdvertiseMode = 0;
|
||||||
|
LPSTR Transforms = HeapAlloc(GetProcessHeap(), 0, 1);
|
||||||
|
LANGID Language = 0;
|
||||||
|
|
||||||
LPSTR DllName = NULL;
|
LPSTR DllName = NULL;
|
||||||
|
|
||||||
Properties[0] = 0;
|
Properties[0] = 0;
|
||||||
|
Transforms[0] = 0;
|
||||||
|
|
||||||
for(i = 1; i < argc; i++)
|
for(i = 1; i < argc; i++)
|
||||||
{
|
{
|
||||||
|
@ -262,40 +268,82 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
else if(!strncasecmp(argv[i], "/j", 2))
|
else if(!strncasecmp(argv[i], "/j", 2))
|
||||||
{
|
{
|
||||||
i++;
|
int j;
|
||||||
if(i >= argc)
|
int len = strlen(argv[i]);
|
||||||
ShowUsage(1);
|
FunctionAdvertise = TRUE;
|
||||||
WINE_FIXME("Advertising not yet implemented\n");
|
for(j = 2; j < len; j++)
|
||||||
ExitProcess(1);
|
|
||||||
}
|
|
||||||
else if(!strcasecmp(argv[i], "u") || !strcasecmp(argv[i], "m"))
|
|
||||||
{
|
{
|
||||||
|
switch(argv[i][j])
|
||||||
|
{
|
||||||
|
case 'U':
|
||||||
|
case 'u':
|
||||||
|
AdvertiseMode = ADVERTISEFLAGS_USERASSIGN;
|
||||||
|
break;
|
||||||
|
case 'M':
|
||||||
|
case 'm':
|
||||||
|
AdvertiseMode = ADVERTISEFLAGS_MACHINEASSIGN;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(stderr, "Unknown option \"%c\" in Advertise mode\n", argv[i][j]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
i++;
|
i++;
|
||||||
if(i >= argc)
|
if(i >= argc)
|
||||||
ShowUsage(1);
|
ShowUsage(1);
|
||||||
WINE_FIXME("Advertising not yet implemented\n");
|
PackageName = argv[i];
|
||||||
ExitProcess(1);
|
}
|
||||||
|
else if(!strcasecmp(argv[i], "u"))
|
||||||
|
{
|
||||||
|
FunctionAdvertise = TRUE;
|
||||||
|
AdvertiseMode = ADVERTISEFLAGS_USERASSIGN;
|
||||||
|
i++;
|
||||||
|
if(i >= argc)
|
||||||
|
ShowUsage(1);
|
||||||
|
PackageName = argv[i];
|
||||||
|
}
|
||||||
|
else if(!strcasecmp(argv[i], "m"))
|
||||||
|
{
|
||||||
|
FunctionAdvertise = TRUE;
|
||||||
|
AdvertiseMode = ADVERTISEFLAGS_MACHINEASSIGN;
|
||||||
|
i++;
|
||||||
|
if(i >= argc)
|
||||||
|
ShowUsage(1);
|
||||||
|
PackageName = argv[i];
|
||||||
}
|
}
|
||||||
else if(!strcasecmp(argv[i], "/t"))
|
else if(!strcasecmp(argv[i], "/t"))
|
||||||
{
|
{
|
||||||
i++;
|
i++;
|
||||||
if(i >= argc)
|
if(i >= argc)
|
||||||
ShowUsage(1);
|
ShowUsage(1);
|
||||||
WINE_FIXME("Transforms not yet implemented\n");
|
TempStr = HeapReAlloc(GetProcessHeap(), 0, Transforms, HeapSize(GetProcessHeap(), 0, Transforms)+strlen(argv[i])+1);
|
||||||
|
if(!TempStr)
|
||||||
|
{
|
||||||
|
WINE_ERR("Out of memory!\n");
|
||||||
ExitProcess(1);
|
ExitProcess(1);
|
||||||
}
|
}
|
||||||
else if(!strncasecmp(argv[i], "TRANSFORMS", 10))
|
Transforms = TempStr;
|
||||||
|
strcat(Transforms, argv[i]);
|
||||||
|
strcat(Transforms, ";");
|
||||||
|
}
|
||||||
|
else if(!strncasecmp(argv[i], "TRANSFORMS=", 11))
|
||||||
{
|
{
|
||||||
WINE_FIXME("Transforms not yet implemented\n");
|
TempStr = HeapReAlloc(GetProcessHeap(), 0, Transforms, HeapSize(GetProcessHeap(), 0, Transforms)+strlen(argv[i])+1-11);
|
||||||
|
if(!TempStr)
|
||||||
|
{
|
||||||
|
WINE_ERR("Out of memory!\n");
|
||||||
ExitProcess(1);
|
ExitProcess(1);
|
||||||
}
|
}
|
||||||
|
Transforms = TempStr;
|
||||||
|
strcat(Transforms, argv[i]+11);
|
||||||
|
strcat(Transforms, ";");
|
||||||
|
}
|
||||||
else if(!strcasecmp(argv[i], "/g"))
|
else if(!strcasecmp(argv[i], "/g"))
|
||||||
{
|
{
|
||||||
i++;
|
i++;
|
||||||
if(i >= argc)
|
if(i >= argc)
|
||||||
ShowUsage(1);
|
ShowUsage(1);
|
||||||
WINE_FIXME("Language ID not yet implemented\n");
|
Language = strtol(argv[i], NULL, 0);
|
||||||
ExitProcess(1);
|
|
||||||
}
|
}
|
||||||
else if(!strncasecmp(argv[i], "/l", 2))
|
else if(!strncasecmp(argv[i], "/l", 2))
|
||||||
{
|
{
|
||||||
|
@ -354,6 +402,17 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
Properties = TempStr;
|
Properties = TempStr;
|
||||||
}
|
}
|
||||||
|
if(Transforms[strlen(Transforms)-1] == ';')
|
||||||
|
{
|
||||||
|
Transforms[strlen(Transforms)-1] = 0;
|
||||||
|
TempStr = HeapReAlloc(GetProcessHeap(), 0, Transforms, HeapSize(GetProcessHeap(), 0, Transforms)-1);
|
||||||
|
if(!TempStr)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Out of memory!\n");
|
||||||
|
ExitProcess(1);
|
||||||
|
}
|
||||||
|
Transforms = TempStr;
|
||||||
|
}
|
||||||
|
|
||||||
if(FunctionInstall)
|
if(FunctionInstall)
|
||||||
{
|
{
|
||||||
|
@ -387,6 +446,14 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if(FunctionAdvertise)
|
||||||
|
{
|
||||||
|
if(MsiAdvertiseProductA(PackageName, (LPSTR) AdvertiseMode, Transforms, Language) != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Advertising of %s (%lu, %s, 0x%04x) failed.\n", PackageName, AdvertiseMode, Transforms, Language);
|
||||||
|
ExitProcess(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
else if(FunctionDllRegisterServer)
|
else if(FunctionDllRegisterServer)
|
||||||
{
|
{
|
||||||
DllRegisterServer(DllName);
|
DllRegisterServer(DllName);
|
||||||
|
|
|
@ -21,11 +21,6 @@
|
||||||
typedef HRESULT (*DLLREGISTERSERVER)(void);
|
typedef HRESULT (*DLLREGISTERSERVER)(void);
|
||||||
typedef HRESULT (*DLLUNREGISTERSERVER)(void);
|
typedef HRESULT (*DLLUNREGISTERSERVER)(void);
|
||||||
|
|
||||||
/* Advertising flags */
|
|
||||||
|
|
||||||
#define ADVERTISE_CURRENT_USER 0x00000001
|
|
||||||
#define ADVERTISE_ALL_USERS 0x00000002
|
|
||||||
|
|
||||||
/* Logging flags */
|
/* Logging flags */
|
||||||
|
|
||||||
#define LOG_STATUS_MESSAGES 0x00000001
|
#define LOG_STATUS_MESSAGES 0x00000001
|
||||||
|
|
Loading…
Reference in New Issue