我正在尝试以编程方式创建.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

有什么想法吗?

有帮助吗?

解决方案

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

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

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

我不知道为什么会这样。

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

代码编译......现在看看我能否做到我需要的东西。

其他提示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top