C++ C++;:在Windows中创建快捷方式-使用MinGW/g++;
经过一些研究,我找到了如何使用C++/MinGW/g++在Windows中创建快捷方式的解决方案:C++ C++;:在Windows中创建快捷方式-使用MinGW/g++;,c++,C++,经过一些研究,我找到了如何使用C++/MinGW/g++在Windows中创建快捷方式的解决方案: #include <stdio.h> #include <windows.h> #include <Shlobj.h> #include <objidl.h> #include <iostream> using namespace std; HRESULT CreateLink( LPCWSTR FilePath,
#include <stdio.h>
#include <windows.h>
#include <Shlobj.h>
#include <objidl.h>
#include <iostream>
using namespace std;
HRESULT CreateLink(
LPCWSTR FilePath,
LPCWSTR LnkPath,
LPCWSTR LnkDesc,
LPCWSTR WorkDir) {
CoInitialize(NULL);
IShellLinkW* psl;
HRESULT hres = CoCreateInstance(
CLSID_ShellLink,
NULL,
CLSCTX_INPROC_SERVER,
IID_IShellLink,
(LPVOID *) & psl);
if (SUCCEEDED(hres)) {
IPersistFile* ppf;
wstring file(L"C:\\jarlauncher.exe");
psl->SetPath((LPWSTR)file.c_str());//Not working - only first letter is visible in created shortcut properties
psl->SetWorkingDirectory(WorkDir);
psl->SetDescription(LnkDesc);
hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*) & ppf);
if (SUCCEEDED(hres)) {
hres = ppf->Save(LnkPath, TRUE);
ppf->Release();
}
psl->Release();
}
CoUninitialize();
return hres;
}
编辑:
现在的工作示例:
#include <Shlobj.h>
#include <tchar.h>
using namespace std;
HRESULT CreateLink(
LPCWSTR filePath,
LPCWSTR workDir,
LPCWSTR desc,
LPCWSTR iconPath,
LPCWSTR linkPath) {
CoInitialize(NULL);
IShellLinkW* psl;
HRESULT hres = CoCreateInstance(
CLSID_ShellLink,
NULL,
CLSCTX_INPROC_SERVER,
IID_IShellLinkW,
(LPVOID*) &psl);
if (SUCCEEDED(hres)) {
IPersistFile* ppf;
psl->SetPath(filePath);
psl->SetWorkingDirectory(workDir);
psl->SetDescription(desc);
psl->SetIconLocation(iconPath, 0);
hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*) &ppf);
if (SUCCEEDED(hres)) {
hres = ppf->Save(linkPath, TRUE);
ppf->Release();
}
psl->Release();
}
CoUninitialize();
return hres;
}
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) {
CreateLink(
L"C:\\Program Files\\Appl\\Appl.exe",
L"C:\\Program Files\\Appl",
L"Location: C:\\Program Files\\Appl",
L"C:\\Program Files\\Appl\\someIcon.ico",
L"C:\\Appl.lnk");//Shortcut will be created at C:/
return 0;
}
#包括
#包括
使用名称空间std;
HRESULT CreateLink(
LPCWSTR文件路径,
LPCWSTR workDir,
LPCWSTR desc,
LPCWSTR iconPath,
LPCWSTR链接路径){
共初始化(空);
IShellLinkW*psl;
HRESULT hres=CoCreateInstance(
CLSID_ShellLink,
无效的
CLSCTX_INPROC_服务器,
IID_IShellLinkW,
(LPVOID*)和psl);
如果(成功(hres)){
IPersistFile*ppf;
psl->SetPath(filePath);
psl->设置工作目录(workDir);
psl->SetDescription(描述);
psl->SetIconLocation(iconPath,0);
hres=psl->QueryInterface(IID_IPersistFile,(LPVOID*)和ppf);
如果(成功(hres)){
hres=ppf->Save(linkPath,TRUE);
ppf->Release();
}
psl->Release();
}
coninitialize();
返回hres;
}
int APIENTRY_tWinMain(HINSTANCE HINSTANCE、HINSTANCE HPPREINSTANCE、LPTSTR lpCmdLine、int nCmdShow){
CreateLink(
L“C:\\Program Files\\Appl\\Appl.exe”,
L“C:\\Program Files\\Appl”,
L“位置:C:\\Program Files\\Appl”,
L“C:\\Program Files\\Appl\\someIcon.ico”,
L“C:\\Appl.lnk”);//将在C:/
返回0;
}
您还需要在项目属性中添加Ole32.lib
和Uuid.lib
库文件。如果不需要终端窗口,只要添加<代码> -MWindows >代码> C++编译器选项即可。仅此而已-不再有“秘密”信息
此文件在带有C/C++插件的Windows+NetBeans IDE 8.0上进行测试,加上安装在C:\的MinGW和msys,并在NetBeans IDE当前项目属性中正确配置。听起来好像您没有明确定义
UNICODE
,如果您定义了,那么它应该调用条件代码:
#ifdef UNICODE
#define IID_IShellLink IID_IShellLinkW
#else
#define IID_IShellLink IID_IShellLinkA
#endif
当您请求IShellLink的通用版本时,它将为您提供IShellLink的广泛版本。在您的情况下,您必须显式地用IID\u IShellLinkW
替换IID\u IShellLink
,当您调用CoCreateInstance
时,它将实例化宽版本,从而获得所有宽例程
在官方的MSSDK和mingw转换之间,标题看起来有些不同(我认为这是通过在这些标题中使用\uu mingw\u NAME\u AW()
宏实现的)
你能用一个例子来详细说明你的问题吗?对于初学者来说,你忘了包括
。快捷方式是创建的,但当我打开它的属性时,只有一个起始字母,注释是可见的,尽管例如SetDescription(…)
是长文本。我想这是unicode-IShellLinkW*
声明为unicode的东西,但看起来它需要ANSI字符串。如果我将其更改为IShellLink*
,一切正常……但我需要unicode支持。只是为了验证,是sizeof(wchar\t)MinGW中的2?它是实现定义的;Linux上的GCC使用4,而Windows API需要2。@ErnestasGruodis,UNICODE
定义了吗?你不能在宽字符串和窄字符串之间转换并期望它工作,如果函数使用LPCTSTR
并且你说它们需要窄字符串,那么你必须注意这一点。Unf很重要的是,我不认为有任何方法可以指定每个成员函数的广泛版本。@Petesh-非常感谢。现在它工作得很好。我已将IID_-IShellLink
更改为IID_-IShellLinkW
@Ernestassgruodis:实际上代码无论如何都不会编译,因为注释“不工作”之前缺少右括号。我讨厌这些心灵感应的问题。+1我发表了一条评论,说如果以上是问题,代码不应该编译,但那是错误的。所以今天学到了一些新的东西,这种错误是可能的。谢谢@Petesh@Cheers和hth.-Alf-edited,现在应该可以了。这只是一个示例-它甚至不使用构造函数参数..但是-它可以这是一个真正可行的例子。
#ifdef UNICODE
#define IID_IShellLink IID_IShellLinkW
#else
#define IID_IShellLink IID_IShellLinkA
#endif