MsiGetShortcutTargetA: Ich krieg's nicht hin! :mad



  • Hi,

    gestern hab' ich mir den ganzen Abend um die Ohren geschlagen um dieses "simple" (?) Problem zu lösen: Ich möchte das Ziel eines Shortcuts (.lnk) mittels der MSI.dll Function MsiGetShortcutTargetA auslesen. Damit das heute nicht schon wieder passiert, bitte ich jetzt doch mal um Hilfe 😃

    Das Problem: Das Programm steigt immer an der Stelle "Could not find shortcut target" aus, obwohl argv[1] einen gültigen Shortcut mitkriegt.

    #include <windows.h>
    #include <iostream>
    using namespace std;
    
    typedef unsigned int (*DLLFUNC)(const char*, char*, char*, char*);
    
    int main(int args, char* argv[])
    {
    char productCode[39];
    char componentCode[39];
    
        if (args <= 1)
           return -1;
    
        HINSTANCE hinstMSI = NULL;
        hinstMSI = LoadLibrary("msi.dll");     // handle to MSI.dll
        if (!hinstMSI)
        {
            MessageBox(NULL,"Could not find MSI.dll!", "Error", MB_OK);
            return -1;
        }
        DLLFUNC GetShortcutTarget = (DLLFUNC)GetProcAddress(hinstMSI, "MsiGetShortcutTargetA");
        if (!GetShortcutTarget)
        {
            MessageBox(NULL,"Error using MSI.dll function!", "Error", MB_OK);
            return -1;
        }
    
        if (GetShortcutTarget(argv[1],productCode,NULL,componentCode) == ERROR_FUNCTION_FAILED)
        {
            MessageBox(NULL,"Could not find shortcut target!", NULL, MB_OK);
            return -1;
        }
    
    // ab hier würde dann MsiGetComponentPath kommen, wenn das Programm bis hierhin käme...
    
        FreeLibrary(hinstMSI);
    
        return 0;
    }
    

    Mir geht's nicht um alternative Lösungswege (ich weiß da gibt es einige), sondern ich möchte wissen, warum mein Programm nicht funktioniert 😕

    Danke für jeden Hinweis!!!
    -ZenJu



  • Keiner 'ne Ahnung?



  • Das geht nur mit speziellen Shortcuts, bei einem Shortcut von MS Word funktioniert es zum Beispiel.

    Bei deinem typdef muss du noch die Calling Konvention auf __stdcall ändern, z.B. in dem du WINAPI hinzufügst.

    typedef unsigned int (WINAPI *DLLFUNC)(const char*, char*, char*, char*);
    


  • Das geht natprlich nur mit Shortcuts, die in irgendeiner Beziehugn zu MSI (Installer, bzw. installierten Programmen) stehen... z.B. mit den Shortcuts des Desktops...


Anmelden zum Antworten