0

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

谢谢

4

2 回答 2

0

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

如果你想变得更高级,你可以使用 C++ 库 Boost::Filesystem。

于 2012-08-24T16:59:09.100 回答
0

我解决了:

 char * pch;
 pch = strstr (szValueBuf,"ServerSetup.msi");
 strncpy (pch,"product.ini",15);
 puts (szValueBuf);
于 2012-08-27T10:16:02.987 回答