2012-08-24 105 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

嗨,我已經編輯我的問題上面,你能幫助更多的嗎? –