Я работаю над проектом установки в Advanced Installer 10.2. Я обнаружил, что я могу использовать DLL для последовательной проверки, затем я обнаружил, этот ресурс на их сайте.
Мне удалось построить эту 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, смотрите здесь:
Но когда я запускаю установщик и пытаюсь продолжить установку, после точки последовательной вставки я получаю следующее сообщение об ошибке:
Где моя ошибка? Кто-нибудь знает хороший учебник по этому поводу? Я искал в интернете, но мне ничего не помогает …
У вас могут быть две проблемы:
либо вы ввели имя метода вместо того, чтобы выбирать его из комбо, загруженного Advanced Installer. В этом случае установщик не может вызвать метод из DLL, так как не может его найти.
или есть проблема с вашим кодом, и в этом случае вам нужно отладить его, как вы бы делали с обычным настраиваемым действием, присоединяющимся из VS (добавьте блок сообщений с точкой останова после него).
Других решений пока нет …