C 使用IShellLink会将可执行文件扩展到20KB
因为很多时候,我使用一个函数在Windows中创建链接。源代码为纯C: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,
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);
}
}