By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
435,247 Members | 1,057 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 435,247 IT Pros & Developers. It's quick & easy.

how to create .msi package with serial number validation?

P: 1
hello,
i am very new to vc++.i have the code.
Expand|Select|Wrap|Line Numbers
  1. #include "windows.h"
  2. #include "stdafx.h"
  3.  
  4. // Need the following header files to access the MSI API
  5.  
  6. #include "msi.h"
  7. #include "msiquery.h"
  8. #pragma comment(lib, "msi.lib")
  9.  
  10. // Export the function so MSI can call it using undecorated C style name
  11. extern "C" _declspec(dllexport) UINT __stdcall VerifyPID(MSIHANDLE hInstall);
  12.  
  13.  
  14. // Private Function definitions
  15. TCHAR* GetPIDValue(TCHAR*);
  16.  
  17. extern "C" UINT __stdcall VerifyPID(MSIHANDLE hInstall)
  18. {
  19.    // Local variables
  20.    UINT    nRetVal = 0;
  21.    UINT    uiMsiRc;
  22.    TCHAR   szPidKey[MAX_PATH];
  23.    TCHAR   szSourceDir[MAX_PATH];
  24.    TCHAR*  lpszPidValue;
  25.    DWORD   dwBuffer;
  26.  
  27.    // Get the source folder for the msi project
  28.    dwBuffer = sizeof(szSourceDir)/sizeof(TCHAR);
  29.  
  30.    uiMsiRc = MsiGetProperty(hInstall, TEXT("SourceDir"), szSourceDir, &dwBuffer);
  31.  
  32.    if (ERROR_SUCCESS != uiMsiRc)
  33.    {
  34.       MessageBox(NULL, "Not able to retrieve the SourceDir property.  The setup may be corrupt.  Please contact Technical Support.", "Setup Error", MB_OK | MB_ICONEXCLAMATION);
  35.       return 0;
  36.    }
  37.  
  38.    // Call function to decrypt the PID to validate against from a file stored on setup media
  39.    lpszPidValue = GetPIDValue(szSourceDir);
  40.  
  41.     // Get the PIDKEY property value entered by the user from the active msi
  42.    dwBuffer = sizeof(szPidKey)/sizeof(TCHAR);
  43.  
  44.    uiMsiRc = MsiGetProperty(hInstall, TEXT("PIDKEY"), szPidKey, &dwBuffer);
  45.  
  46.    if (ERROR_SUCCESS != uiMsiRc)
  47.    {
  48.       MessageBox(NULL, "Not able to retrieve PIDKEY property.  The setup may be corrupt.  Please contact Technical Support.", "Setup Error", MB_OK | MB_ICONEXCLAMATION);
  49.       return 0;
  50.    }
  51.  
  52.    //Insert code to check PIDKEY here
  53.    int str = lstrcmp(szPidKey, lpszPidValue);
  54.  
  55.    //If PIDKEY passes check
  56.    if (str == 0)
  57.       MsiSetProperty(hInstall, "PIDCHECK", "TRUE");
  58.    //If PIDKEY doesn't pass check
  59.    else
  60.    {
  61.       MsiSetProperty(hInstall, "PIDCHECK", "FALSE");
  62.       MessageBox(NULL, "Please enter the correct product registration code!", "Invalid Key", MB_OK | MB_ICONINFORMATION);
  63.    }
  64.  
  65.    return 0;
  66. }
  67.  
  68. // GetPIDValue is used to locate and decrypt a key file on the setup media
  69. //  that contains the PID string to validate against.
  70.  
  71. TCHAR* GetPIDValue(TCHAR* lpszSourceDir)
  72. {
  73.     // lpszSourceDir contains the fully qualified path to the location where the setup is running.  
  74.     // For example, suppose the msi is located on a CD in the folder "\Setup\MySetup.msi".
  75.     // The user is running the CD in the D: drive.  
  76.     // lpszSourceDir will have a value of "D:\Setup\".  
  77.     // Note that the trailing slash is included!
  78.  
  79.     // TO DO: Concatenate key file path, example lpszSourceDir + "MyKeyFile.dat"
  80.     // TO DO: Read key file from source media
  81.     // TO DO: Code decryption algorithm for key file
  82.     // For this example, simply return a literal PID key of format <### - #######>
  83.  
  84.         return "123 - 4567890";
  85. }
how can i attach "MyKeyFile.dat" which i given in comment line.

thanks in advance,
Jun 9 '09 #1
Share this question for a faster answer!
Share on Google+

Post your reply

Sign in to post your reply or Sign up for a free account.