Jump to content


This is a ready-only archive of the InstallSite Forum. You cannot post any new content here. / Dies ist ein Archiv des InstallSite Forums. Hier können keine neuen Beiträge veröffentlicht werden.
Photo

Anpassen von Destination Folders von Components


1 reply to this topic

Marsyas

Marsyas
  • Full Members
  • 31 posts

Posted 28 May 2008 - 13:12

Hallo Leute,

ich hab den gleichen Post zwar schon einmal in Englisch verfasst, trotzdem wollte ich die deutsche Community auch noch mal um Hilfe bitten.

Ich hab folgendes Problem: Ich möchte gern einen Druckertreiber installieren und habe mir für diesen Zweck eine MSI-DLL (=Aufruf als CA) geschrieben, die genau das tut. Bevor ich aber die Action aufrufe, muss ich die Druckertreiberdateien ins lokale Druckertreiberverzeichnis installieren. Das ist normalerweise unter 'c:\Windows\System32\spool\drivers\w32x86' zu finden, aber den genauen Pfad liefert ein Call der Funktion GetPrinterDriverDirectory() den MS dankenswerterweise eingebaut hat.

Dummerweise habe ich jetzt aber Probleme, bei der Übergabe des Strings, der diesen Pfad enthält. Ich hab einen weiteren Call in meine MSI-DLL eingebaut, der mir ein Property im MSI setzt, mit dessen Hilfe ich dann den Pfad der Components aktualisieren möchte.

Das ganze sieht dann so aus:

CODE

UINT __stdcall SetPrnDriverDirProp2(MSIHANDLE hMsi)
{
TCHAR szPrinterDriverDir[MAX_PATH];
DWORD cbPrinterDriverDir = sizeof(szPrinterDriverDir);

ZeroMemory(&szPrinterDriverDir, cbPrinterDriverDir);
if (!GetPrinterDriverDirectory(NULL, NULL, 1, (LPBYTE)szPrinterDriverDir, MAX_PATH, &cbPrinterDriverDir))
{
 /* some error handling */
}

TCHAR szTmp[MAX_PATH] = {0};
DWORD nLen = MAX_PATH;

ZeroMemory(szTmp, MAX_PATH);
UINT nRet1 = MsiGetProperty(hMsi, _T("SYSPRINTERDIRPROP"), szTmp, &nLen);
UINT nRet2 = MsiSetProperty(hMsi, _T("SYSPRINTERDIRPROP"), szPrinterDriverDir);

return ERROR_SUCCESS;
}


Und normalerweise würde jetzt noch eine 2. CA folgen, die dann den selbstdefinierten Folder auf das richtige Verzeichnis umsetzt. Aber aus mir nicht nachvollziehbaren Gründen liefert in meinem Sample der Call auf die Funktion MsiSetProperty() immer ERROR_INVALID_HANDLE zurück, obwohl ich vorher erfolgreich ein MsiGetProperty aufrufen kann. Der Handle kann also nicht wirklich ungültig sein.

Nun meine Frage: Was mache ich falsch?

Die CA wird natürlich im Modus 'Immediate Execution' aufgerufen, andernfalls wäre ein Setzen von Properties ohnehin nicht möglich. Gbt es noch weitere Möglichkeiten, den Pfad von Components, bzw. Userdefined Folders anzupassen? Kann ich vielleicht direkt den selbstdefinierten Folder auf einen bestimmten Pfad setzen (statt des Umwegs über die Properties)?

Vielen Dank für eure Hilfe!

Marsyas

Stefan Krueger

Stefan Krueger

    InstallSite.org

  • Administrators
  • 13,269 posts

Posted 30 May 2008 - 12:13

Das ist wirklich seltsam. Schreib doch mal eine DLL die nichts anderes macht als ein Property zu setzen. Ggf. verwende dazu das Beispielproject von CodeProject.