C 使用IShellLink会将可执行文件扩展到20KB

C 使用IShellLink会将可执行文件扩展到20KB,c,mingw,C,Mingw,因为很多时候,我使用一个函数在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,

因为很多时候,我使用一个函数在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);
    }
}
这个函数工作得很好,但我注意到,在MingW4.7.4中,我的可执行文件大约大10KB,这仅仅是因为这个函数。 我现在已经将MinGW更新到了5.3.0版本,现在这个函数将可执行文件的大小增加了大约20KB。 代码针对大小(-Os)进行了优化,符号被剥离。事实上,这种膨胀是由链接器解析“IID_IShellLink”时引起的


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

最后,我找到了解决这个问题的方法。我们只需要直接在函数中定义guid。这样,链接器就不再需要uuid库,可执行文件就尽可能小,而且工作得很好。
这两种guid都可以在objidl.h(mingw6.2.0)中找到

这并不能解释链接器中包含的数据的含义,但至少回答了这个问题。

您尝试过吗?编译失败,因为“IID_IShellLink”未声明,即使我将此“include”放在所有其他数据之前。
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);
    }
}