Erreur dans l'éditeur de liens Wine: tentative de création du fichier .lnk
Question
J'essaie de créer un fichier .lnk par programme. Je préférerais utiliser C, mais C ++ n’est pas un problème (et c’est ce que contient tout le contenu de MSDN).
L'exemple de code approprié est:
#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;
}
J'essaie de compléter Wineg ++ en utilisant:
wineg++ -mno-cygwin -o t t2.cpp
Et j'obtiens les erreurs suivantes:
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
Des idées?
La solution
La solution semble être de changer la section includes en:
#define INITGUID
#include <windows.h>
#include <shobjidl.h>
#include <shlguid.h>
#include <initguid.h>
Par exemple, ajoutez #define INITGUID
avant tout et incluez #include <initguid.h>
Je ne sais pas pourquoi cela fonctionne.
J'ai également dû ajouter -lole32 pour corriger une erreur survenue après la résolution de celle citée.
Le code est compilé ... maintenant pour voir si je peux le faire faire ce dont j'ai besoin.
Autres conseils
L'éditeur de liens se plaint de ne pas savoir où IID_IShellLinkA
est défini. Vous avez la déclaration dans un en-tête, mais il vous manque probablement une bibliothèque. Je pense que cela est défini dans libuuid , alors incluez-le dans votre commande de liaison avec -luuid
. L'éditeur de liens est probablement configuré pour inclure automatiquement un certain ensemble de bibliothèques, y compris kernel32 et user32, mais uuid peut ne pas figurer dans cette liste.