Pregunta

I am working on an installer project in Advanced Installer 10.2. I found out that I can use a DLL for serial validation then I found this resource on their website.

I succeeded in building that DLL, here is my code:

// SerialValidationLib.cpp : Defines the exported functions for the DLL application. //

#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; 
}

I also imported it to Advanced Installer, look here:

enter image description here

But when I run the installer, and try to proceed with the installation, after serial insertion point, I get this error message:

enter image description here

Where is my mistake? Does anybody know a good tutorial about this? I searched on the internet, but nothing helps me...

¿Fue útil?

Solución

You could have two problems:

  • either you have typed the method name instead of picking it from the combo loaded by Advanced Installer. In this case the installer fails to call the method from the DLL, as it cannot find it.

  • or, there is a problem with your code, in which case you need to debug it, as you would do with a normal custom action, attaching from VS (add a mesagebox with a breakpoint after it).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top