我正在尝试以编程方式创建.lnk文件。我更喜欢使用C,但C ++很好(并且是所有MSDN的东西)。
相关代码示例为:
#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;
}
我正在尝试使用以下方法补充wineg ++:
wineg++ -mno-cygwin -o t t2.cpp
我收到以下错误:
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
有什么想法吗?
答案 0 :(得分:2)
解决方案似乎是将包含部分更改为:
#define INITGUID
#include <windows.h>
#include <shobjidl.h>
#include <shlguid.h>
#include <initguid.h>
即,在所有内容之前添加#define INITGUID
并包含#include <initguid.h>
我不知道为什么会这样。
我还必须添加-lole32来修复引用的问题解决后出现的错误。
代码编译......现在看看我能否做到我需要的东西。
答案 1 :(得分:1)
链接器抱怨说它不知道IID_IShellLinkA
的定义位置。你在标题中有声明,但你可能错过了一个库。我认为它是在 libuuid 中定义的,所以在你的链接命令中包含-luuid
。链接器可能被配置为自动包含一组特定的库,包括kernel32和user32,但是uuid可能不在该列表中。