0

Advanced Installer 10.2 でインストーラー プロジェクトに取り組んでいます。シリアル検証に DLL を使用できることがわかり、Web サイトでこのリソースを見つけました。

その DLL のビルドに成功しました。これが私のコードです。

// SerialValidationLib.cpp : DLL アプリケーション用にエクスポートされた関数を定義します。///

#include "stdafx.h"
#include "SerialValidationLib.h"
#include <Msi.h>
#include <MsiQuery.h>
#include <MsiDefs.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// The one and only application object

CWinApp theApp;

using namespace std;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;

    HMODULE hModule = ::GetModuleHandle(NULL);

    if (hModule != NULL)
    {
        // initialize MFC and print and error on failure
        if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
        {
            // TODO: change error code to suit your needs
            _tprintf(_T("Fatal Error: MFC initialization failed\n"));
            nRetCode = 1;
        }
        else
        {
            // TODO: code your application's behavior here.
        }
    }
    else
    {
        // TODO: change error code to suit your needs
        _tprintf(_T("Fatal Error: GetModuleHandle failed\n"));
        nRetCode = 1;
    }

    return nRetCode;
}



UINT __stdcall ValidateSerial_Sample(MSIHANDLE hInstall) 
{
    TCHAR szPidKey[256]; 
    DWORD dwLen = sizeof(szPidKey)/sizeof(szPidKey[0]); 
    //retrive the text entered by the user 
    UINT res = MsiGetProperty(hInstall, _T("PIDKEY"), szPidKey, &dwLen); 
    if(res != ERROR_SUCCESS) 
    {
        //fail the installation 
        return 1; 
    }
    bool snIsValid = false; 
    //validate the text from szPidKey according to your algorithm 
    //put the result in snIsValid 
    TCHAR * serialValid; 
    if(snIsValid) 
        serialValid = _T("TRUE"); 
    else 
    {
        //eventually say something to the user 
        MessageBox(0, _T("Serial invalid!"), _T("Message"), MB_ICONSTOP); 
        serialValid = _T("FALSE"); 
    }
    res = MsiSetProperty(hInstall, _T("SERIAL_VALIDATION"), serialValid); 
    if(res != ERROR_SUCCESS) 
    {
        return 1; 
    } 
    //the validation succeeded - even the serial is wrong 
    //if the SERIAL_VALIDATION was set to FALSE the installation 
    //will not continue 
    return 0; 
}

Advanced Installer にもインポートしました。こちらをご覧ください。

ここに画像の説明を入力

しかし、インストーラーを実行してインストールを続行しようとすると、シリアル挿入ポイントの後、次のエラー メッセージが表示されます。

ここに画像の説明を入力

私の間違いはどこですか?これについての良いチュートリアルを知っている人はいますか? インターネットで検索しましたが、何も役に立ちません...

4

1 に答える 1

1

次の 2 つの問題が発生する可能性があります。

  • Advanced Installer によってロードされたコンボからメソッド名を選択するのではなく、メソッド名を入力したかのどちらかです。この場合、インストーラーは DLL からのメソッドの呼び出しに失敗します。これは、DLL が見つからないためです。

  • または、コードに問題があります。その場合は、通常のカスタム アクションで行うように、VS からアタッチしてデバッグする必要があります (その後にブレークポイントのあるメッセージ ボックスを追加します)。

于 2013-06-26T09:34:25.330 に答える