我创建了一个C ++自定义动作DLL。我有一个来自DLL的msi但是DLL没有包含在MSI中,它位于与它相同的位置。
我使用以下内容获取MSI的位置:
TCHAR* szValueBuf = NULL;
DWORD cchValueBuf = 0;
UINT uiStat = MsiGetProperty(hInstall, TEXT("OriginalDatabase"), TEXT(""), &cchValueBuf);
if (ERROR_MORE_DATA == uiStat)
{
++cchValueBuf;
szValueBuf = new TCHAR[cchValueBuf];
if (szValueBuf)
{
uiStat = MsiGetProperty(hInstall, TEXT("OriginalDatabase"), szValueBuf, &cchValueBuf);
}
}
if (ERROR_SUCCESS != uiStat)
{
if (szValueBuf != NULL)
delete[] szValueBuf;
return ERROR_INSTALL_FAILURE;
}
这很好用,让我得到完整的路径,但是路径末尾有MSI的名称,我需要删除它以放入我的DLL名称或者还有其他方法吗?
我试过了:
std::string s = "NPath";
int pos = s.find_last_of("\\");
s.erase(0, pos + 1);
s.erase(s.length() - 4, 4);
s.append("product.ini");
但是我收到了这个错误:
error C2894: templates cannot be declared to have 'C' linkage
由于
答案 0 :(得分:0)
使用C或C ++字符串函数将所有字符删除回最后一个斜杠或反斜杠。然后附加你的DLL名称。
如果你想获得更好的体验,你可以使用C ++库Boost :: Filesystem。
答案 1 :(得分:0)
我解决了这个问题:
char * pch;
pch = strstr (szValueBuf,"ServerSetup.msi");
strncpy (pch,"product.ini",15);
puts (szValueBuf);