由于很多时候,我正在使用一个函数在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。 代码针对大小(-Os)进行了优化,并且符号被剥离。事实上,这个膨胀是由链接器在解析“IID_IShellLink”时引起的。
所以,我的问题是:有没有办法避免这种臃肿?
答案 0 :(得分:0)
最后,我找到了如何解决这个问题。我们只需要在函数中直接定义GUID。有了它,链接器不再要求uuid库,可执行文件尽可能小,并且它完美地工作。
两个GUID都可以在objidl.h中找到(MinGW 6.2.0)。
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);
}
}
这并不能解释链接器所包含数据的含义,但至少可以回答这个问题。