Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:在Windows中创建快捷方式-使用MinGW/g++;_C++ - Fatal编程技术网

C++ C++;:在Windows中创建快捷方式-使用MinGW/g++;

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,

经过一些研究,我找到了如何使用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,
        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