Managed Custom Action

Fragen zum AKInstallerMSI
Antworten
Slabon
Beiträge: 11
Registriert: 23.07.2007, 21:30
Wohnort: Mönsheim

Managed Custom Action

Beitrag von Slabon »

Hallo Herr Kaprust,

ich muss in ein Setup eine Custom Action einbauen, die Managed Code aufrufen muss.
Grundsätzlich habe ich mehrere Möglichkeiten ausprobiert, die aber immer irgendwie "problematisch" waren:

1. Ich habe eine C++ DLL und eine C++/Managed DLL. Die reine C++ DLL lädt die zweite dynamisch und ruft über eine C-Api der betreffenden Managed-Code auf.
Problem hierbei ist: Wie kann ich den Installer dazu bewegen, dass beide DLLs aus den Resourcen entpackt werden ? (Zweitere sogar mit einem definierten Namen)

2. (Die von mir bevorzugte Lösung) Ich habe eine einzelne Managed DLL (C#) und der Installer muss hierin eine Custom Action aufrufen. Ich habe gelesen, dass es mit dem Visual Studio Installer und auch Wix geht. Aber was muss ich im Falle des AkInstallers machen ?

3. Ich habe eine einzelne C++/Managed DLL. Hier habe ich aber das Problem, dass diese DLL Verweise auf MFC-DLLs haben muss, die ggfs. noch nicht installiert sind. Die Voraussetzung, dass das Framework 2.0 installiert sein muss (wie bei 2.) ist da deutlich "angenehmer".

Haben Sie eine Idee oder einen guten Hinweis ?

Viele Grüße

Werner Slabon
Andreas Kapust
Administrator
Beiträge: 1085
Registriert: 29.02.2004, 15:51
Wohnort: Hamburg
Kontaktdaten:

Re: Managed Custom Action

Beitrag von Andreas Kapust »

Guten Tag!

1: Entpacken Sie die Daten selbst z. B. so:

Code: Alles auswählen

BYTE *GetMSIStream(MSIHANDLE m_msidb, LPCTSTR m_Select, int column, DWORD &m_Len)
{
	PMSIHANDLE hView;
	BYTE *bufBinary = NULL;

	if(MsiDatabaseOpenView(m_msidb, m_Select, &hView) != ERROR_SUCCESS)
		return NULL;

	if(MsiViewExecute(hView, NULL) != ERROR_SUCCESS)
		return NULL;

	UINT res;
	PMSIHANDLE hRecRow;

	while ((res = MsiViewFetch(hView, &hRecRow)) != ERROR_NO_MORE_ITEMS) 
		{
		DWORD cbSize = MsiRecordDataSize(hRecRow, column);
		m_Len = cbSize;
		bufBinary = new BYTE[cbSize+5];

		ZeroMemory(bufBinary,cbSize+3);
		if(MsiRecordReadStream(hRecRow, column, (char*)bufBinary, &cbSize) != ERROR_SUCCESS)
			return NULL;
		}

	return bufBinary;
}
...
	bufBinary = GetMSIStream(MsiGetActiveDatabase(hInstall), _T("SELECT Data FROM Binary WHERE Name='MEINE_DLL'"), 1, dwDatenSize);
...
2: Der AKInstallerMSI bietet diese Möglichkeit zur Zeit noch nicht.
Mit freundlichen Grüßen,
AKApplications, Andreas Kapust
Soernt
Beiträge: 28
Registriert: 22.03.2011, 08:01

Re: Managed Custom Action

Beitrag von Soernt »

Hallo Herr Kapust
2. (Die von mir bevorzugte Lösung) Ich habe eine einzelne Managed DLL (C#) und der Installer muss hierin eine Custom Action aufrufen. Ich habe gelesen, dass es mit dem Visual Studio Installer und auch Wix geht. Aber was muss ich im Falle des AkInstallers machen ?
2: Der AKInstallerMSI bietet diese Möglichkeit zur Zeit noch nicht.
Könnte Sie diese Funktionalität noch einbauen? Als nicht C/C++ Entwickler komme ich mit C# doch deutlich besser zurecht :-) Das wäre wirklich hilfreich!

Viele Grüße
Sörnt Poppe
Andreas Kapust
Administrator
Beiträge: 1085
Registriert: 29.02.2004, 15:51
Wohnort: Hamburg
Kontaktdaten:

Re: Managed Custom Action

Beitrag von Andreas Kapust »

Guten Tag!

Ist geplant, ET steht aber nicht fest.
Mit freundlichen Grüßen,
AKApplications, Andreas Kapust
Soernt
Beiträge: 28
Registriert: 22.03.2011, 08:01

Re: Managed Custom Action

Beitrag von Soernt »

Das hört sich gut an.

Vielen Dank
Sörnt Poppe
Antworten