2012-08-24 99 views
0

我创建了C++自定义动作DLL。我有一个从DLL中调用的msi,但该DLL不包含在MSI中,它与它位于相同的位置。C++自定义动作DLL的路径

我使用以下方法来获得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

我的工作了:

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

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

如果您希望更有趣,可以使用C++库Boost :: Filesystem。

+0

嗨,我已经编辑我的问题上面,你能帮助更多的吗? –