2009-03-03 7 views
2

zu erstellen Ich versuche, eine LNK-Datei programmatisch zu erstellen. Ich würde lieber C, aber C++ ist in Ordnung (und das ist, was alle MSDN-Zeug ist).Wine Linker Fehler: versuchen, .lnk

Das entsprechende Codebeispiel ist:

#include <windows.h> 
#include <shobjidl.h> 
#include <shlguid.h> 

HRESULT CreateLink(LPCSTR lpszPathObj, LPCSTR lpszPathLink, LPCSTR lpszDesc) { 
    HRESULT hres; 
    IShellLink* psl; 

    /* Get a pointer to the IShellLink interface. */ 
    hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, 
          IID_IShellLink, (LPVOID*)&psl); 
    return hres; 
} 

Ich versuche, mit WINEG comple ++ verwenden:

wineg++ -mno-cygwin -o t t2.cpp 

Und ich bin immer folgende Fehler:

 
t2-Tw9YPp.o: In function `CreateLink(char const*, char const*, char const*)': 
t2.cpp:(.text+0x34): undefined reference to `IID_IShellLinkA' 
/usr/bin/ld: t2-Tw9YPp.o: relocation R_386_GOTOFF against undefined hidden symbol `IID_IShellLinkA' can not be used when making a shared object 
/usr/bin/ld: final link failed: Bad value 
collect2: ld returned 1 exit status 
winegcc: i486-linux-gnu-g++ failed 

Irgendwelche Ideen?

+0

Sie sagen, Ihre Frage ist, wie Sie eine Verknüpfungsdatei erstellen, aber das Problem, das Sie veranschaulichen, ist ein Linker-Fehler. Weißt du, wie man die Verknüpfung erstellt, und du hast nur Probleme beim Erstellen des Programms, oder wird das Fixieren des Linker-Problems immer noch Sie stecken stecken fragen, was als nächstes zu tun? –

+0

I * denke * Ich habe einen Beispielcode von MSDN, der die Grundlage für das ist, was ich brauche, wenn ich es zum Verknüpfen bringen kann. Ich sollte wohl den Fragetitel ändern, es ist * irreführend – singpolyma

Antwort

2

Die Lösung scheint zu sein, das beinhaltet Abschnitt zu ändern:

#define INITGUID 
#include <windows.h> 
#include <shobjidl.h> 
#include <shlguid.h> 
#include <initguid.h> 

dh, fügen Sie vor allem und umfassen #define INITGUID#include <initguid.h>

Ich habe keine Ahnung, warum das funktioniert.

Ich musste auch -lole32 hinzufügen, um einen Fehler zu beheben, der aufkam, nachdem der zitierte Fehler behoben wurde.

Der Code kompiliert ... jetzt um zu sehen, ob ich es machen kann, was ich brauche.

1

Der Linker beschwert sich, dass es nicht weiß, wo IID_IShellLinkA definiert ist. Sie haben die Deklaration in einer Kopfzeile, aber Sie vermissen wahrscheinlich eine Bibliothek. Ich denke, es ist in libuuid definiert, so dass in Ihrem Link-Befehl mit -luuid. Der Linker ist wahrscheinlich so konfiguriert, dass er automatisch einen bestimmten Satz von Bibliotheken enthält, einschließlich kernel32 und user32, aber uid ist möglicherweise nicht in dieser Liste enthalten.

+0

Hinzufügen -luuid ändert die Fehlermeldungen nicht. Es ist kein Fehler, die Bibliothek nicht zu finden, nur der Fehler wird nicht geändert. – singpolyma

+0

Ich habe keinen Wein, daher kann ich nicht mit Sicherheit sagen, in welcher Bibliothek er definiert ist. Sie können sehen, was eine Unix-Bibliotheksdatei mit elfdump enthält. Vielleicht funktioniert das auch für Wine-Bibliotheken, so dass Sie Ihren lib-Ordner nach der Datei durchsuchen können, die Sie benötigen. –

+1

Ich habe Wein heruntergeladen. Ich finde die Zeichenfolge "IID_IShellLinkA" in shell32.dll.so. –