[C#] Windows Installer API gebruiken

Pagina: 1
Acties:
  • 208 views sinds 30-01-2008
  • Reageer

  • MichelVH
  • Registratie: Oktober 2001
  • Laatst online: 01-08 09:33
Ik ben begonnen aan een programma in C#, waarin ik gebruik wil gaan maken van de Windows Installer functies. Denk bijvoorbeeld aan het installeren van een functie op het moment dat die voor het eerst gebruikt gaat worden, ala Microsoft Office.

Na wat zoeken vond ik op MSDN de SDK en een overzicht van alle beschikbare API calls. Volgens de SDK moet elk programma eerst MsiGetProductCode aanroepen om de ProductCode te achterhalen, dus daar ben ik maar mee begonnen :)

C#:
1
2
[DllImport("msi")]
public static extern uint MsiGetProductCode(string szComponent, string lpProductBuf);

C#:
1
2
string lpProductBuf = "";
MsiGetProductCode("{GUID}", lpProductBuf);

Hierbij krijg ik echter altijd als waarde van lpProductBuf een lege string :( De waarde die de functie zelf teruggeeft klopt wel, want die geeft ERROR_SUCCESS terug wat dus betekent dat de call gelukt is. Ook MsiSpy geeft aan dat het component wel correct is geïnstalleerd.

De Automation Interface van uit msi.dll is trouwens geen oplossing, want die bevat in .NET alleen interfaces |:( Wie ziet wat ik na een dag zoeken nog niet zie?

Don't be afraid of the dark, be afraid of what it hides


  • MichelVH
  • Registratie: Oktober 2001
  • Laatst online: 01-08 09:33
*schop*

Is er echt niemand die de oplossing weet? Oplossing mag ook VB.NET zijn (heb ik ook geprobeerd, kreeg ik ook niet aan de praat), en als 't echt niet anders kan een bestaande library die wél werkt in C# :?

Don't be afraid of the dark, be afraid of what it hides


  • TheMrH
  • Registratie: April 2000
  • Laatst online: 04-08 12:18
Kan aan mijn lack of kennis in C# liggen, maar moet die string lpProductBuf = "";
geen char* lpProductBuf zijn? Anders kan het ook nog es aan je initializatie van de string liggen, hij moet 39 characters long zijn...

Uit de MSDN:
UINT MsiGetProductCode(
LPCTSTR szComponent,
LPTSTR lpProductBuf
);
Dus volgens mij wel....., en volgens de remarks zelfs een char[39] ipv een char*, of je moet hem malloc()en :)

The box said 'requires Windows 95 or better', so I installed Linux...


  • JohanDM
  • Registratie: Augustus 2002
  • Laatst online: 16-07-2021

JohanDM

Optimist

Met Google heb ik een artikel gevonden, dat uitlegt hoe je de MSI API kan gebruiken.

Langs de andere kant zijn er voor .NET betere alternatieven zoals Smart Clients die beter benaderen wat jij wil berijken; zie ook dit artikel uit MSDN Magazine.

"Two things are infinite: the universe and stupidity. And the former I'm not so sure about." -- Albert Einstein


  • MichelVH
  • Registratie: Oktober 2001
  • Laatst online: 01-08 09:33
Nadat ik het dit weekend weer zonder resultaat urenlang heb zitten proberen, heb ik het maar eens bij Microsoft gevraagd. De oplossing is nogal simpel, maar je moet er maar op komen:
C#:
1
2
[DllImport("msi")]
public static extern uint MsiGetProductCode(string szComponent, System.Text.StringBuilder lpProductBuf);

C#:
1
2
3
System.Text.StringBuilder lpProductBuf = new System.Text.StringBuilder(39, 39);
MsiGetProductCode("{GUID}", lpProductBuf);
MessageBox.Show(lpProductBuf.ToString());

StringBuilder dus, en geen strings |:( Wel vreemd dat ik hier op MSDN en met Google niets over heb kunnen vinden

Don't be afraid of the dark, be afraid of what it hides