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 に答える