1

我在 Visual Studio 2010(Windows 窗体)中遇到了 SHGetFolderPathA 的问题。我包含到项目中ShlObj.h并为按钮添加了此代码:

char SciezkaCookies[MAX_PATH];
HRESULT hr = ::SHGetFolderPathA(0, CSIDL_APPDATA, 0, SHGFP_TYPE_DEFAULT, SciezkaCookies);

但是当我尝试编译我的项目时,视觉返回错误:

错误 LNK2028:未解析的令牌 (0A000012) “extern "C" long stdcall SHGetFolderPathA(struct HWND *,int,void *,unsigned long,char *)" (?SHGetFolderPathA@@$$J220YGJPAUHWND__@@HPAXKPAD@Z) 在函数中引用“私人:void __clrcall VoxPopuli::Form1::start_Click(类 System::Object ^,类 System::EventArgs ^)”(?start_Click@Form1@VoxPopuli@@$$FA$AAMXP$AAVObject@System@@P$ AAVEventArgs@4@@Z)

1>VoxPopuli.obj : 错误 LNK2019: 无法解析的外部符号 "extern "C" long stdcall SHGetFolderPathA(struct HWND *,int,void *,unsigned long,char *)" (?SHGetFolderPathA@@$$J220YGJPAUHWND__@@HPAXKPAD@Z ) 在函数“private: void __clrcall VoxPopuli::Form1::start_Click(class System::Object ^,class System::EventArgs ^)”中引用 (?start_Click@Form1@VoxPopuli@@$$FA$AAMXP$AAVObject@System @@P$AAVEventArgs@4@@Z)

我正在谷歌中寻找解决方案,但所有示例都不起作用;/

感谢帮助!

4

3 回答 3

2

从 C++/CLI 调用像 SHGetFolderPath() 这样的原生 winapi 函数就很好,这是该语言擅长的,但你必须让链接器自己开心。使用该功能的MSDN 库文章(不是今天,站点已经关闭了一个星期)。在文章的底部,它列出了“Header”,这就是你发现你需要告诉编译器关于 shlobj.h 的方式。它还列出了“导入库”,这就是您需要告诉链接器的内容。导入库告诉链接器在运行时需要加载什么 DLL 来调用函数。

项目 + 属性、链接器、输入、附加依赖项。添加“shell32.lib”

或者您在源代码中使用#pragma 执行此操作,这是一种将链接指令传递给链接器的方法:

#include <shlobj.h>
#pragma comment(lib, "shell32.lib")

应该说,这绝对是你真正希望别人处理的一个api函数。请注意 MSDN Library 文章如何也说该功能已弃用。跨 Windows 版本的标准文件夹路径有很多变化。您可以在 .NET 应用程序中随时使用“其他人”,Environment::GetFolderPath() 会为您执行此操作。还可以让您免于处理不同字符串类型的麻烦。

于 2012-06-16T15:09:29.503 回答
0

您必须自己声明它以避免包含 Windows 标头 - 不是我责怪您这样做 - 但您已经破坏了名称,因此链接器无法从本机库中解析它。

哦,你在 C++/CLI 中?那么,也许编译器完全不喜欢对托管代码的本机调用。

于 2012-06-16T11:25:40.163 回答
0

如果 .NET 解决方案可行,我会避免使用本机函数。尝试使用

 Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData));

此处讨论了本机和 .NET 方法:http: //bytes.com/topic/c-sharp/answers/269259-my-documents-path-c

于 2012-06-16T13:17:31.520 回答