C ++自定义动作DLL的路径

时间:2012-08-24 14:46:48

标签: c++ dll

我创建了一个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

由于

2 个答案:

答案 0 :(得分:0)

使用C或C ++字符串函数将所有字符删除回最后一个斜杠或反斜杠。然后附加你的DLL名称。

如果你想获得更好的体验,你可以使用C ++库Boost :: Filesystem。

答案 1 :(得分:0)

我解决了这个问题:

 char * pch;
 pch = strstr (szValueBuf,"ServerSetup.msi");
 strncpy (pch,"product.ini",15);
 puts (szValueBuf);