很长时间以来,我一直在使用函数在Windows中创建链接。源代码为纯C语言:

void CreateLink(TCHAR *PathObj, TCHAR *PathLink, TCHAR *ArgV)
{
    IShellLink *psl;
    IPersistFile *ppf;

    if (SUCCEEDED(CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, &IID_IShellLink, (void**)&psl))) {
        psl->lpVtbl->SetPath(psl, PathObj);
        psl->lpVtbl->SetArguments(psl, ArgV);
        if (SUCCEEDED(psl->lpVtbl->QueryInterface(psl, &IID_IPersistFile, (void**)&ppf))) {
            ppf->lpVtbl->Save(ppf, PathLink, TRUE);
            ppf->lpVtbl->Release(ppf);
        }
        psl->lpVtbl->Release(psl);
    }
}


该功能可以正常工作,但是我注意到在MinGW 4.7.4中,我的可执行文件大约只有10KB,因为该功能。
我现在已经将MinGW更新到5.3.0版本,现在此功能将可执行文件的大小增加了约20KB。
代码针对大小(-O)进行了优化,并且去除了符号。实际上,此膨胀是由链接程序解析“ IID_IShellLink”时引起的。

所以,我的问题是:有没有办法避免这样的膨胀?

最佳答案

最后,我找到了解决该问题的方法。我们只需要直接在函数中定义GUID。这样,链接器就不再需要uuid库了,可执行文件越小越好,并且可以完美地工作。
可以在objidl.h(MinGW 6.2.0)中找到这两个GUID。

void CreateLink(TCHAR *PathObj, TCHAR *PathLink, TCHAR *ArgV)
{
    GUID IID_IShellLinkW = {0x000214f9, 0, 0, {0xc0, 0, 0, 0, 0, 0, 0, 0x46}};
    GUID IID_IPersistFile = {0x0000010b, 0, 0, {0xc0, 0, 0, 0, 0, 0, 0, 0x46}};
    IShellLink *psl;
    IPersistFile *ppf;

    if (SUCCEEDED(CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, &IID_IShellLinkW, (void**)&psl))) {
        psl->lpVtbl->SetPath(psl, PathObj);
        psl->lpVtbl->SetArguments(psl, ArgV);
        if (SUCCEEDED(psl->lpVtbl->QueryInterface(psl, &IID_IPersistFile, (void**)&ppf))) {
            ppf->lpVtbl->Save(ppf, PathLink, TRUE);
            ppf->lpVtbl->Release(ppf);
        }
        psl->lpVtbl->Release(psl);
    }
}


这没有解释链接器包含的数据的含义,但是至少可以回答这个问题。

关于c - 使用IShellLink将我的可执行文件膨胀到20KB,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35112942/

10-12 20:03