3

我正在尝试以编程方式创建一个 .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:在函数“CreateLink(char const*, char const*, char const*)”中:
t2.cpp:(.text+0x34): 对‘IID_IShellLinkA’的未定义引用
/usr/bin/ld: t2-Tw9YPp.o: 重定位 R_386_GOTOFF 针对未定义的隐藏符号 `IID_IShellLinkA' 在制作共享对象时不能使用
/usr/bin/ld:最终链接失败:错误值
collect2: ld 返回 1 个退出状态
winegcc:i486-linux-gnu-g++ 失败

有任何想法吗?

4

2 回答 2

3

解决方案似乎是将包含部分更改为:

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

即,#define INITGUID在所有内容之前添加并包括#include <initguid.h>

我不知道为什么会这样。

我还必须添加 -lole32 来修复引用的错误解决后出现的错误。

代码编译......现在看看我是否可以让它做我需要的。

于 2009-03-04T14:51:28.940 回答
1

链接器抱怨它不知道在哪里IID_IShellLinkA定义。您在标头中有声明,但您可能缺少一个库。我认为它是在libuuid中定义的,所以在你的链接命令中包含它-luuid。链接器可能被配置为自动包含一组特定的库,包括 kernel32 和 user32,但 uuid 可能不在该列表中。

于 2009-03-03T23:40:17.353 回答