Finale SmartMusic
  Home | Log In | Register | Search | Help
   
MakeMusic Forum > Public Forums > Plug-In Development - FORUM HAS MOVED! > Installers, uninstallers and other utilities for Finale plug-ins.  Forum Quick Jump
 
You cannot post new topics in this forum. You cannot reply to topics in this forum. Printable Version
[ << Previous Thread | Next Thread >> | Show Newest Post First ]

author
Registered Member

Email Address Not AvailableClick to visit author's website.Send a Private Message to authorAIM Not AvailableICQ Not AvailableY! Not AvailableMSN Not Available
Date Joined Mar 2015
Total Posts : 30
 
   Posted 2/3/2016 3:37 PM (GMT -5)    Quote This PostAlert An Admin About This Post.
If you want your plug-ins can be installed by this installer. The user only need to click the installer .exe-file (this file must be located in the same folder with your .fxt-file) and then follow the install wizard. You can find such installer on www.playmusic-finale.com/downloads.
If you work in Visual C++, create Win32 Project (Windows application). Add the following code:

#include "Shlobj.h"
#include "WinNT.h"
#include "KtmW32.h"        

#include "Shellapi.h"     

#define FINALE_EARLIEST_VERSION 2004                        //Finale 2004
#define FINALE_LATEST_VERSION   2015                        //Finale 2014.5
#define FINALE_2007             2007
#define FINALE_2014_5           2015
#define MISSING_VERSION         2013
#define WINDOWS_VISTA           6 
#define WAIT_TIMER_IDENT        999
#define SHELL_EXECUTE_WAIT_TIME 300

Also declare the global variables and functions:

HWND hInstallWnd;
HANDLE hWaitEvent;
int nOSVersion;

bool __stdcall FindFile(char szFilePath[], char szFileName[]);
int __stdcall  CleanDirectory(char szFilePath[], FILETIME* lpInitFileTime);
VOID CALLBACK WaitTimerProc(HWND hWnd, UINT uMsg, UINT idEvent, DWORD dwTime);


In _tWinMain() delete the Main message loop

    // Main message loop:

    while (GetMessage(&msg, NULL, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

and instead insert the following code:


 char szPluginName[]="YourPluginName";  // replace "YourPluginName" with your real Finale plug-in name!
 char szFilePath[MAX_PATH];
 LONG lResult;
 HKEY  hKeyResult=0;
 char szSubkey[128];
 char szFinaleVersion[16];
 DWORD dwType;
 DWORD dwSizeFilePath=sizeof(szFilePath);                                    
 char szInstallText[256];
 char szInstallMessageBoxText[256];
 char szCurrDir[MAX_PATH];
 char szPluginsFolder[MAX_PATH];
 DWORD dwCurrDirLength;
 WIN32_FIND_DATA findFileData, findNewFileData;
 int nFinaleNums=0;
 struct 
 {
  char* lpszFullPath;
  int version; 
 }
 finalePlugins[24];

 char szCaption[256];
 strcpy(szCaption, "Install ");
 strcat(szCaption, szPluginName);

 LPOSVERSIONINFO lpVersionInformation=new OSVERSIONINFO;                               
 lpVersionInformation->dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
 GetVersionEx(lpVersionInformation);
 nOSVersion=(int)lpVersionInformation->dwMajorVersion;
 delete lpVersionInformation;

 dwCurrDirLength=GetCurrentDirectory(sizeof(szCurrDir), szCurrDir);
 strcat(szCurrDir, "\\");
 strcat(szCurrDir, szPluginName);
 strcat(szCurrDir, "*.fxt");

 HANDLE hNewFile=FindFirstFile(szCurrDir, &findNewFileData);
 if (hNewFile!=INVALID_HANDLE_VALUE)
 {
  szCurrDir[dwCurrDirLength+1]='\0';
  strcat(szCurrDir, findNewFileData.cFileName);
  FindClose(hNewFile);
 }
 else
 {
  MessageBox(hInstallWnd, "The install file was not found.", szCaption, MB_OK | MB_ICONSTOP); 
  return (int) msg.wParam;
 }
///////
 if(nOSVersion>=WINDOWS_VISTA)
 {
    HANDLE hMutexControl=0;
    HANDLE hMutex=CreateMutex(NULL, true, "InstallFinalePluginMutex");
    int nResult=GetLastError();
    if(nResult==ERROR_ALREADY_EXISTS)
      hMutexControl=CreateMutex(NULL, true, "InstallFinalePluginMutexControl");   
    else
    {
      char szInstallModuleFileName[256];
      GetModuleFileName(NULL, szInstallModuleFileName, sizeof(szInstallModuleFileName));

      HINSTANCE hInstanceSE=ShellExecute(NULL, "runas", szInstallModuleFileName, 0, 0, SW_SHOWNORMAL);
      //The app re-runs itself as admin 
//-------------------------------------------------------------------------------------------------------
      if((int)hInstanceSE<32)
      {
        ReleaseMutex(hMutex);
        CloseHandle(hMutex);
        MessageBox( hInstallWnd, "Install failed. Try to install manually.", szCaption, MB_OK | MB_ICONSTOP );
        return 0;
      }
//------------------------------------------------------------------------------------------------------
      bool bRepeat=true;
      do
      {
        hWaitEvent=CreateEvent(NULL, true, false, NULL);
       MSG uMessage;
       DWORD dwResult;
       bool bDone=false;
       SetTimer(hInstallWnd, WAIT_TIMER_IDENT, SHELL_EXECUTE_WAIT_TIME, (TIMERPROC)WaitTimerProc);
              
       while( !bDone )
       {
        dwResult = MsgWaitForMultipleObjects( 1, &hWaitEvent, false, INFINITE, QS_ALLINPUT );
        if(dwResult==WAIT_OBJECT_0 + 1)
         while( PeekMessage( &uMessage, NULL, 0, 0, PM_REMOVE ) )
          if( uMessage.message == WM_QUIT )
            bDone = true;
          else
            DispatchMessage( &uMessage );
         else
             break;
       }
       ResetEvent(hWaitEvent);
       CloseHandle(hWaitEvent);   
//------------------------------------------------------------------------------------------------------
       hMutexControl = openMutex(SYNCHRONIZE, FALSE, "InstallFinalePluginMutexControl");/////////???????
       if(hMutexControl!=0)
       {
         bRepeat=false;   
         ReleaseMutex(hMutexControl);
         CloseHandle(hMutexControl);
       }
      }
      while(bRepeat);

      ReleaseMutex(hMutex);
      CloseHandle(hMutex);
//-------------------------------------------------------------------------------------------------------
      return 0;  
    }                                //end:  if(!(nResult==ERROR_ALREADY_EXISTS))
 }                                    //end:  if(nOSVersion>=WINDOWS_VISTA)


//-------------------------------------------------------------------------------------------//2.02.16
///////
 for(int nVersion=FINALE_LATEST_VERSION; nVersion>=FINALE_EARLIEST_VERSION; nVersion--)
  if(nVersion!=MISSING_VERSION)                       
  {                                                 //find all Finale versions on the computer
   if(nVersion>FINALE_2007)
   {
    strcpy(szSubkey, "SOFTWARE\\MakeMusic\\Finale"); 
   
    if(nVersion!=FINALE_2014_5)
      itoa(nVersion, szFinaleVersion, 10);
    else
      strcpy(szFinaleVersion, "2014.5");

    strcat(szSubkey, szFinaleVersion);
    lResult=RegopenKeyEx(HKEY_LOCAL_MACHINE, szSubkey, NULL, KEY_QUERY_VALUE, &hKeyResult);
    if(lResult==ERROR_SUCCESS)
    {
     lResult=RegQueryValueEx(hKeyResult, "InstallDir", NULL, &dwType, (LPBYTE)szFilePath, &dwSizeFilePath); 
     RegCloseKey(hKeyResult);
    }              //end:  if(lResult==ERROR_SUCCESS)
   }
   else
    if(nVersion==FINALE_2007)
    {
     strcpy(szSubkey, "SOFTWARE\\MakeMusic\\Finale"); 
     itoa(nVersion, szFinaleVersion, 10);
     strcat(szSubkey, szFinaleVersion);
     strcat(szSubkey, "\\InstallPath");
     lResult=RegopenKeyEx(HKEY_LOCAL_MACHINE, szSubkey, NULL, KEY_QUERY_VALUE, &hKeyResult);
     if(lResult==ERROR_SUCCESS)
     { 
      lResult=RegQueryValueEx(hKeyResult, "", NULL, &dwType, (LPBYTE)szFilePath, &dwSizeFilePath);

      RegCloseKey(hKeyResult);
      for(int n=0; n<dwSizeFilePath-4; n++)
       if((szFilePath[n]=='2')&&(szFilePath[n+1]=='0')&&(szFilePath[n+2]=='0')&&(szFilePath[n+3]=='7'))
         szFilePath[n+4]='\0';
     }                           //end:  if(lResult==ERROR_SUCCESS)
    }                           //end:  if(nVersion==FINALE_2007)
    else
    {                           //begin:  if(nVersion<FINALE_2007)    
     strcpy(szSubkey, "SOFTWARE\\CodaMusic\\Finale"); 
     itoa(nVersion, szFinaleVersion, 10);
     strcat(szSubkey, szFinaleVersion);
     strcat(szSubkey, "\\InstallPath");
     lResult=RegopenKeyEx(HKEY_LOCAL_MACHINE, szSubkey, NULL, KEY_QUERY_VALUE, &hKeyResult);
     if(lResult==ERROR_SUCCESS)
     {
      lResult=RegQueryValueEx(hKeyResult, "", NULL, &dwType, (LPBYTE)szFilePath, &dwSizeFilePath);
                                  
      RegCloseKey(hKeyResult);
      for(int n=0; n<dwSizeFilePath-4; n++)
       if((szFilePath[n]=='2')&&(szFilePath[n+1]=='0')&&(szFilePath[n+2]=='0')&&
           ((szFilePath[n+3]=='4')||(szFilePath[n+3]=='5')||(szFilePath[n+3]=='6')))
         szFilePath[n+4]='\0';
     }                           //end:  if(lResult==ERROR_SUCCESS)
    }                           //end:  if(nVersion<FINALE_2007)

   if((lResult==ERROR_SUCCESS)&&(dwType==REG_SZ))
   {
    strcat(szFilePath, "\\Plug-ins");

    finalePlugins[nFinaleNums].lpszFullPath=new char[256];
    strcpy(finalePlugins[nFinaleNums].lpszFullPath, szFilePath); 
    finalePlugins[nFinaleNums].version=nVersion;                                      
    nFinaleNums++;                         //number of Finale versions on the computer
   }            //end:   if((lResult==ERROR_SUCCESS)&&(dwType==REG_SZ))
  }        //end:   for(int nVersion=FINALE_LAST_VERSION; nVersion>=FINALE_EARLIEST_VERSION; nVersion--)

 if(nFinaleNums==0)
 {
   MessageBox( hInstallWnd, "Finale was not found on your computer.", szCaption, MB_OK | MB_ICONSTOP );
 }
 else
 {
  int nUninstalledFinale=0;
  int nNotFoundPluginsFolder=0;
  int nInstallNums=0;

  SYSTEMTIME initSysTime;                                   
  GetSystemTime(&initSysTime);
  FILETIME initFileTime;
  SystemTimeToFileTime(&initSysTime, &initFileTime);
  
 // strcpy(szPluginsFolder, szFilePath);                                    
 // strcat(szPluginsFolder, "\\*");

  for(int nNumFinaleCopy=0; nNumFinaleCopy<nFinaleNums; nNumFinaleCopy++) 
  {
   strcpy(szFilePath, finalePlugins[nNumFinaleCopy].lpszFullPath); 
                                                
   strcpy(szPluginsFolder, szFilePath);                                    
   strcat(szPluginsFolder, "\\*");

   hNewFile=FindFirstFile(szFilePath, &findNewFileData);                       
   if(hNewFile==INVALID_HANDLE_VALUE)
   {
    int nStrlen=strlen(szFilePath);
    char* szFilePathTemp=new char[MAX_PATH];
    strcpy(szFilePathTemp, szFilePath);            
    for( ; nStrlen>0; nStrlen--)
     if(szFilePathTemp[nStrlen]=='\\')
       break;
    szFilePathTemp[nStrlen]='\0';      
    hNewFile=FindFirstFile(szFilePathTemp, &findNewFileData);                       
    if(hNewFile!=INVALID_HANDLE_VALUE)
    {
     bool bVersion_2014_5=false;
     strcpy(szInstallText, "Plug-ins folder was not found for Finale ");
     for( ; nStrlen>3; nStrlen--)
      if((szFilePathTemp[nStrlen]>='0')&&(szFilePathTemp[nStrlen]<='9'))
       if((szFilePathTemp[nStrlen-1]>='0')&&(szFilePathTemp[nStrlen-1]<='9'))
        if(szFilePathTemp[nStrlen-2]=='0')
           if(szFilePathTemp[nStrlen-3]=='2')
         {
          if((szFilePathTemp[nStrlen-1]=='1')&&(szFilePathTemp[nStrlen]=='4')&&
             (szFilePathTemp[nStrlen+1]=='.')&&(szFilePathTemp[nStrlen+2]=='5'))
          {
            nStrlen+=2;                                                
            bVersion_2014_5=true; 
          }
          szFilePathTemp[nStrlen+1]='\0';
          break;
         }                                    
     if(nStrlen>3)
     {
      int nNumCharTemp=0;
      for( ; nNumCharTemp<(bVersion_2014_5?6:4); nNumCharTemp++)
        szFinaleVersion[nNumCharTemp]=szFilePathTemp[nStrlen+nNumCharTemp-(bVersion_2014_5?5:3)];
      szFinaleVersion[nNumCharTemp]='\0';           
     }
     strcat(szInstallText, szFinaleVersion);
     strcat(szInstallText, ".");
     MessageBox(hInstallWnd, szInstallText, szCaption, MB_OK | MB_ICONSTOP);
     FindClose(hNewFile);
     nNotFoundPluginsFolder++;
    }                          //end:  if(hNewFile!=INVALID_HANDLE_VALUE)
    else
      nUninstalledFinale++;
    delete[] szFilePathTemp;
    continue;
   }                         //end:  if(hNewFile==INVALID_HANDLE_VALUE)
   else
     FindClose(hNewFile);

   strcat(szFilePath, "\\*");
  
   if(!FindFile(szFilePath, szPluginName))
   {
    nInstallNums++;
    strcpy(szFilePath, finalePlugins[nNumFinaleCopy].lpszFullPath);

    if(finalePlugins[nNumFinaleCopy].version!=FINALE_2014_5)
      itoa(finalePlugins[nNumFinaleCopy].version, szFinaleVersion, 10);
    else
      strcpy(szFinaleVersion, "2014.5");

    int wchars_num =  MultiByteToWideChar(CP_UTF8, 0, szFilePath, -1, NULL, 0);
    wchar_t* wstr = new wchar_t[wchars_num];
    MultiByteToWideChar(CP_UTF8, 0, szFilePath, -1, wstr, wchars_num);

    PIDLIST_ABSOLUTE *ppidl = new PIDLIST_ABSOLUTE;
    SHParseDisplayName(wstr, NULL, ppidl, NULL, NULL);
    delete[] wstr;

    if(nFinaleNums==1)
    {
      strcpy(szInstallText, "Select an existing folder or create a new one to install ");
      strcat(szInstallText, szPluginName);
      strcat(szInstallText, ". By default it will be installed directly in the Plug-ins folder.");
    }
    else
    {                                                   //begin:  if(!(nFinaleNums==1))
     strcpy(szInstallText, "Do you want to install ");
     strcat(szInstallText, szPluginName);
     strcat(szInstallText, " in Finale ");
     strcat(szInstallText, szFinaleVersion);
     strcat(szInstallText, "?");
     int nRetValue=MessageBox(hInstallWnd, szInstallText, szCaption,
                               MB_YESNOCANCEL | MB_ICONQUESTION | MB_DEFBUTTON1);
     if(nRetValue==IDYES)
     {
      strcpy(szInstallText, "Select an existing folder or create a new one to install ");
      strcat(szInstallText, szPluginName);
      strcat(szInstallText, ". By default it will be installed directly in the Plug-ins folder.");
     }
     else
      if(nRetValue==IDNO)
      {
        delete[] finalePlugins[nNumFinaleCopy].lpszFullPath;
        continue;
      }
      else
       if(nRetValue==IDCANCEL)
       {                                                                              
         for( ; nNumFinaleCopy<nFinaleNums; nNumFinaleCopy++)
           delete[] finalePlugins[nNumFinaleCopy].lpszFullPath;
         return (int) msg.wParam;
       }
    }                                           //end:  if(!(nFinaleNums==1))

    PIDLIST_ABSOLUTE lpItem;
    int nOkCancel;
    do 
    {                       //begin:  do ... while((lpItem!=NULL)&&(nOkCancel==IDCANCEL))
     TCHAR szDir[MAX_PATH];
     BROWSEINFO bInfo;
     bInfo.hwndOwner = hInstallWnd;
     bInfo.pidlRoot = *ppidl; 
     bInfo.pszDisplayName = szDir; // Address of a buffer to receive the display name of the folder selected by the user
     bInfo.lpszTitle = szInstallText; // Title of the dialog
     bInfo.ulFlags = BIF_VALIDATE | BIF_NEWDIALOGSTYLE ;
     bInfo.lpfn = NULL;                               
     bInfo.lParam = 0;
     bInfo.iImage = -1;
      
     lpItem = SHBrowseForFolder(&bInfo);

     if(lpItem!=NULL)
     {
      SHGetPathFromIDList(lpItem, szDir);
      strcpy(szInstallMessageBoxText, szPluginName);
      strcat(szInstallMessageBoxText, " will be located in the directory \n");      
      strcat(szInstallMessageBoxText, szDir); 

      nOkCancel=MessageBox(hInstallWnd, szInstallMessageBoxText, szCaption, 
                                    MB_OKCANCEL | MB_ICONEXCLAMATION |MB_DEFBUTTON1);
      if(nOkCancel==IDCANCEL)
      {
        CleanDirectory(szPluginsFolder, &initFileTime);        
        continue;
      }
      int nPathLength=strlen(szCurrDir);
      for( ; nPathLength>0; nPathLength--)
       if(szCurrDir[nPathLength]=='\\')
         break; 
      if(nPathLength>0)
      {
       char* lpszFileName;
       lpszFileName=&szCurrDir[nPathLength];
       strcat(szDir, lpszFileName);

       if(CopyFile(szCurrDir, szDir, false))                    //27.07.15                                                  
       {                                                                
        bool bFinaleIsRunning=false;
        char szModulePath[256];
        strcpy(szModulePath, finalePlugins[nNumFinaleCopy].lpszFullPath);
        int nStrlen=strlen(szModulePath);
        for( ; nStrlen>=0; nStrlen--)
         if(szModulePath[nStrlen]=='\\')
           break;  
        szModulePath[nStrlen+1]='\0';
        strcat(szModulePath, "Finale.exe");

        HANDLE hFile=CreateFile(szModulePath, GENERIC_WRITE    |GENERIC_READ, 0, NULL, open_EXISTING,
                               FILE_ATTRIBUTE_NORMAL, NULL    );

        if(hFile== INVALID_HANDLE_VALUE)
          bFinaleIsRunning=true;
        else
          CloseHandle(hFile);

        int nFullPath=strlen(finalePlugins[nNumFinaleCopy].lpszFullPath);
        for(int nNumChar=0; nNumChar<nFullPath; nNumChar++)
         if(((char)*(finalePlugins[nNumFinaleCopy].lpszFullPath+nNumChar)=='2')&&
            ((char)*(finalePlugins[nNumFinaleCopy].lpszFullPath+nNumChar+1)=='0')&&
            ((char)*(finalePlugins[nNumFinaleCopy].lpszFullPath+nNumChar+2)>='0')&&
            ((char)*(finalePlugins[nNumFinaleCopy].lpszFullPath+nNumChar+2)<='9')&&
            ((char)*(finalePlugins[nNumFinaleCopy].lpszFullPath+nNumChar+3)>='0')&&
            ((char)*(finalePlugins[nNumFinaleCopy].lpszFullPath+nNumChar+3)<='9'))
         {
          bool bFinale_2014_5=false;
          if(((char)*(finalePlugins[nNumFinaleCopy].lpszFullPath+nNumChar+2)=='1')&&
             ((char)*(finalePlugins[nNumFinaleCopy].lpszFullPath+nNumChar+3)=='4')&&
             ((char)*(finalePlugins[nNumFinaleCopy].lpszFullPath+nNumChar+4)=='.')&&
             ((char)*(finalePlugins[nNumFinaleCopy].lpszFullPath+nNumChar+5)=='5'))
            bFinale_2014_5=true;

          int nNumCharTemp=0;
          for( ; nNumCharTemp<(bFinale_2014_5?6:4); nNumCharTemp++)            //31.01.16
            szFinaleVersion[nNumCharTemp]=(char)*(finalePlugins[nNumFinaleCopy].lpszFullPath+nNumChar+nNumCharTemp);
          szFinaleVersion[nNumCharTemp]='\0';
          break;
         }

        if(nFinaleNums==1)
         if(bFinaleIsRunning)
         { 
          strcpy(szInstallMessageBoxText, " Installation  successfully completed.\n "); 
          strcat(szInstallMessageBoxText, szPluginName);
          strcat(szInstallMessageBoxText, " will be available after restarting Finale ");
          strcat(szInstallMessageBoxText, szFinaleVersion);
          strcat(szInstallMessageBoxText, ".");
          MessageBox( hInstallWnd, szInstallMessageBoxText, szCaption, MB_OK | MB_ICONASTERISK );
         } 
         else
           MessageBox( hInstallWnd, "Installation successfully completed.", szCaption, MB_OK | MB_ICONASTERISK );
        else
        {                         //begin:  if(!(nFinaleNums==1))
         if(bFinaleIsRunning)
         { 
          strcpy(szInstallMessageBoxText, " Installation  successfully completed.\n ");
          strcat(szInstallMessageBoxText, szPluginName);
          strcat(szInstallMessageBoxText, " will be available after restarting Finale ");
          strcat(szInstallMessageBoxText, szFinaleVersion);
          strcat(szInstallMessageBoxText, ".");
         } 
         else
         {
          strcpy(szInstallMessageBoxText, szPluginName);
          strcat(szInstallMessageBoxText, " has been successfully installed."); 
         }
         MessageBox( hInstallWnd, szInstallMessageBoxText, szCaption, MB_OK | MB_ICONASTERISK );
        }                      //end:  if(!(nFinaleNums==1))
       }                  //end:  if(CopyFile(szCurrDir, szDir, false))
       else
       {
         MessageBox( hInstallWnd, "Installation failed. Try to install manually.", szCaption, MB_OK | MB_ICONSTOP );  
       }
      }                      //end:   if(nPathLength>0)
     }                     //end:   if( lpItem != NULL )
     else
       CleanDirectory(szPluginsFolder, &initFileTime);                     
    }           
    while((lpItem!=NULL)&&(nOkCancel==IDCANCEL));

    delete ppidl;
   }                   //end:   if(!FindFile(szFilePath, szPluginName)
   delete[] finalePlugins[nNumFinaleCopy].lpszFullPath;
  }                   //end:   for(int nNumFinaleCopy=0; nNumFinaleCopy<nFinaleNums; nNumFinaleCopy++) 

  if(nInstallNums==0)
   if(nFinaleNums==nUninstalledFinale+nNotFoundPluginsFolder)
    if(nNotFoundPluginsFolder>0);
    else
      MessageBox( hInstallWnd, "Finale was not found.", szCaption, MB_OK | MB_ICONSTOP ); 
   else 
   { 
     strcpy(szInstallMessageBoxText, szPluginName);
     strcat(szInstallMessageBoxText, " already installed.");
     MessageBox( hInstallWnd, szInstallMessageBoxText, szCaption, MB_OK | MB_ICONSTOP ); 
   }
 }                 //end:    if(!(nFinaleNums==0))

Don't forget to replace "YourPluginName" with your real Finale plug-in name.
You can replace at the end of _tWinMain()

return (int) msg.wParam;

to

return 0;


In InitInstance() after

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
                                     CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

insert

   hInstallWnd = hWnd;
   nCmdShow=SW_SHOWMINIMIZED;


Here are the declared above functions:

bool __stdcall  FindFile(char szFilePath[], char szFileName[])
{
  HANDLE hFile;
  WIN32_FIND_DATA findFileData;
  int nNullPos=strlen(szFilePath);

  hFile=FindFirstFile(szFilePath, &findFileData);

  if (hFile!=INVALID_HANDLE_VALUE)
  {
   do                                 //begin:  do ... while (FindNextFile(hFile, &findFileData)!=0);
    if((strcmp(findFileData.cFileName, ".")!=0)&&(strcmp(findFileData.cFileName, "..")!=0))
    {
     if(findFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
     {
       szFilePath[nNullPos-1]='\0';
       strcat(szFilePath, findFileData.cFileName); 
       strcat(szFilePath, "\\*");

       if(FindFile(szFilePath, szFileName))
       {
         FindClose(hFile);
         return true;
       }
       else
       {
         szFilePath[nNullPos-1]='*';
         szFilePath[nNullPos]='\0';
       }
     }
     else
      if(strstr(findFileData.cFileName, szFileName)!=NULL)
      {
        szFilePath[nNullPos-1]='\0';
        strcat(szFilePath, findFileData.cFileName); 
        FindClose(hFile);
        return true;
      }
    }   //end:  if((strcmp(findFileData.cFileName, ".")!=0)&&(strcmp(findFileData.cFileName, "..")!=0))
   while (FindNextFile(hFile, &findFileData)!=0);

   szFilePath[nNullPos-1]='*';
   szFilePath[nNullPos]='\0';
   FindClose(hFile);
   return false;
  }
  else
    return false;
}

//************************************************************************************************************

int __stdcall  CleanDirectory(char szFilePath[], FILETIME* lpInitFileTime)
{
  #define ERROR   -1
  WIN32_FIND_DATA findFileData;
  HANDLE hFile;
  int nNullPos;
  nNullPos=strlen(szFilePath);
  int nFilesCount=0;

  hFile=FindFirstFile(szFilePath, &findFileData);

  if (hFile!=INVALID_HANDLE_VALUE)
  {
   do                                      //begin:  do ... while (FindNextFile(hFile, &findFileData)!=0);
    if((strcmp(findFileData.cFileName, ".")!=0)&&(strcmp(findFileData.cFileName, "..")!=0))
    {
     nFilesCount++;
     if(findFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
     {
       szFilePath[nNullPos-sizeof(char)]='\0';
       strcat(szFilePath, findFileData.cFileName); 
       strcat(szFilePath, "\\*");

       int nResult=CleanDirectory(szFilePath, lpInitFileTime);
       if(nResult==ERROR)
         return ERROR;
       else
        if(nResult==0)
         if(CompareFileTime(&(findFileData.ftCreationTime), lpInitFileTime)>=0)
         {
           int nStrlen=strlen(szFilePath);
           char szFilePathTemp[MAX_PATH];
           strcpy(szFilePathTemp, szFilePath);
           szFilePathTemp[nStrlen-2]='\0';;
           RemoveDirectory(szFilePathTemp);
           nFilesCount--;
         }
     }
    }        //end:  if((strcmp(findFileData.cFileName, ".")!=0)&&(strcmp(findFileData.cFileName, "..")!=0))
   while (FindNextFile(hFile, &findFileData)!=0);

   szFilePath[nNullPos-sizeof(char)]='*';
   szFilePath[nNullPos]='\0';
   FindClose(hFile);
   return nFilesCount;
  }
  else
    return ERROR;
}

//********************************************************************************************************

VOID CALLBACK WaitTimerProc                                          
   (
    HWND hWnd,         // handle of window for timer messages
    UINT uMsg,        // WM_TIMER message
    UINT idEvent,    // timer identifier
    DWORD dwTime     // current system time
   )
{
   if(idEvent==WAIT_TIMER_IDENT)                          
   {
       KillTimer(hWnd, idEvent);
       SetEvent(hWaitEvent);    
   }
}

Post Edited (author) : 3/21/2016 1:32:28 PM (GMT-5)

Back to Top

author
Registered Member

Email Address Not AvailableClick to visit author's website.Send a Private Message to authorAIM Not AvailableICQ Not AvailableY! Not AvailableMSN Not Available
Date Joined Mar 2015
Total Posts : 30
 
   Posted 2/7/2016 11:39 AM (GMT -5)    Quote This PostAlert An Admin About This Post.
NOTE: In _tWinMain() the open_EXISTNG parameter in the function CreateFile() and the name of the function RegopenKeyEx for unknown reasons are displayed incorrectly. The first four letters in the name open_EXISTNG must be in upper case and in Win API functions RegopenKeyEx the fourth letter ' O ' must be in upper case too.

In Configuration Properties->General->Character Set you should select: Not Set

Post Edited (author) : 2/7/2016 9:57:21 AM (GMT-6)

Back to Top

author
Registered Member

Email Address Not AvailableClick to visit author's website.Send a Private Message to authorAIM Not AvailableICQ Not AvailableY! Not AvailableMSN Not Available
Date Joined Mar 2015
Total Posts : 30
 
   Posted 3/21/2016 4:11 AM (GMT -5)    Quote This PostAlert An Admin About This Post.
Your plug-ins can be updated using this utility. The user only need to click the update .exe-file (the file must be located in the same folder with your plug-in's .fxt-file) and then follow the update wizard.
If you work in Visual C++, create Win32 Project (Windows application). Via Project->...Properties...->Configuration Properties->Linker->Input->Additional Dependencies add version.lib. Then insert the following code:

#include "Shlobj.h"
#include "WinNT.h"
#include "KtmW32.h"        
#include "Shellapi.h"     

#define FINALE_EARLIEST_VERSION 2004                        //Finale 2004
#define FINALE_LATEST_VERSION   2015                        //Finale 2014.5
#define FINALE_2007             2007
#define FINALE_2014_5           2015
#define MISSING_VERSION         2013
#define WINDOWS_VISTA           6 
#define WAIT_TIMER_IDENT        999
#define SHELL_EXECUTE_WAIT_TIME 300

Declare the global variables and functions:

HANDLE hWaitEvent;
HWND hUpdateWnd;
int nOSVersion;

bool __stdcall  FindFile(char szFilePath[], char szFileName[]);
VOID CALLBACK WaitTimerProc(HWND hWnd, UINT uMsg, UINT idEvent, DWORD dwTime);

In _tWinMain() delete the Main message loop


    // Main message loop:

    while (GetMessage(&msg, NULL, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

and instead insert the following code:

 char szPluginName[]="YourPluginName";  // replace "YourPluginName" with your real Finale plug-in name!!!
 char szFilePath[MAX_PATH];
 DWORD dwSizeFilePath=sizeof(szFilePath); 
 LONG lResult;
 HKEY  hKeyResult=0;
 char szSubkey[128];
 char szFinaleVersion[16];
 DWORD dwType;
 char szUpdateText[256];
 bool bCloseFinale=false;
 int nUpdateNums=0;
 bool bUpdate=false;
 char szCurrDir[256];
 DWORD dwCurrDirLehgth;
 WIN32_FIND_DATA findFileData, findNewFileData;
 union TPluginVersionInfoData
 {
   unsigned int dwData;
   BYTE bData;
 };
 TPluginVersionInfoData pluginVersionInfoNew, pluginVersionInfo; 

 char szCaption[256];
 strcpy(szCaption, "Update ");
 strcat(szCaption, szPluginName);

 LPOSVERSIONINFO lpVersionInformation=new OSVERSIONINFO;
 lpVersionInformation->dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
 GetVersionEx(lpVersionInformation);
 nOSVersion=(int)lpVersionInformation->dwMajorVersion;
 delete lpVersionInformation;

 dwCurrDirLehgth=GetCurrentDirectory(sizeof(szCurrDir), szCurrDir);
 strcat(szCurrDir, "\\");
 strcat(szCurrDir, szPluginName);
 strcat(szCurrDir, "*.fxt");
 HANDLE hNewFile=FindFirstFile(szCurrDir, &findNewFileData);

 if (hNewFile!=INVALID_HANDLE_VALUE)
 {
   szCurrDir[dwCurrDirLehgth+1]='\0';
   strcat(szCurrDir, findNewFileData.cFileName);
   FindClose(hNewFile);

   DWORD dwVersionInfoSize;                                                           
   BYTE *pVersionInfo = NULL;
   VS_FIXEDFILEINFO  *pFileInfo = NULL;
   UINT  nLenFileInfo = 0;

   dwVersionInfoSize = GetFileVersionInfoSize( szCurrDir, NULL );

   pVersionInfo = new BYTE[ dwVersionInfoSize ];
   GetFileVersionInfo( szCurrDir, 0, dwVersionInfoSize, pVersionInfo );
   VerQueryValue( pVersionInfo, TEXT("\\"), (LPVOID*) &pFileInfo, &nLenFileInfo );

   DWORD dwLeftMost = HIWORD(pFileInfo->dwFileVersionMS);      
   DWORD dwSecondLeft = LOWORD(pFileInfo->dwFileVersionMS);    
   DWORD dwSecondRight = HIWORD(pFileInfo->dwFileVersionLS);   
   DWORD dwRightMost = LOWORD(pFileInfo->dwFileVersionLS);     

   pluginVersionInfoNew.bData[0]=(BYTE)dwRightMost;
   pluginVersionInfoNew.bData=(BYTE)dwSecondRight;
   pluginVersionInfoNew.bData=(BYTE)dwSecondLeft;
   pluginVersionInfoNew.bData=(BYTE)dwLeftMost;

   delete[]  pVersionInfo;
 }                                  //end:  if (hNewFile!=INVALID_HANDLE_VALUE)
 else
 {
   MessageBox( hUpdateWnd, "The update file was not found.", szCaption, MB_OK | MB_ICONSTOP ); 
   return (int) msg.wParam;
 }

 if(nOSVersion>=WINDOWS_VISTA)
 {
    HANDLE hMutexControl=0;
    HANDLE hMutex=CreateMutex(NULL, true, "UpdateFinalePluginMutex");
    int nResult=GetLastError();
    if(nResult==ERROR_ALREADY_EXISTS)
      hMutexControl=CreateMutex(NULL, true, "UpdateFinalePluginMutexControl");   
    else
    {
      char szUpdateModuleFileName[256];
      GetModuleFileName(NULL, szUpdateModuleFileName, sizeof(szUpdateModuleFileName));

      HINSTANCE hInstanceSE=ShellExecute(NULL, "runas", szUpdateModuleFileName, 0, 0, SW_SHOWNORMAL);
      //The app re-runs itself as admin 
//-------------------------------------------------------------------------------------------------------
      if((int)hInstanceSE<32)
      {
        ReleaseMutex(hMutex);
        CloseHandle(hMutex);
        MessageBox( hUpdateWnd, "Update failed. Try to update manually.", szCaption, MB_OK | MB_ICONSTOP );
        return 0;
      }
//------------------------------------------------------------------------------------------------------
      bool bRepeat=true;
      do
      {
        hWaitEvent=CreateEvent(NULL, true, false, NULL);
       MSG uMessage;
       DWORD dwResult;
       bool bDone=false;
       SetTimer(hUpdateWnd, WAIT_TIMER_IDENT, SHELL_EXECUTE_WAIT_TIME, (TIMERPROC)WaitTimerProc);
              
       while( !bDone )
       {
        dwResult = MsgWaitForMultipleObjects( 1, &hWaitEvent, false, INFINITE, QS_ALLINPUT );
        if(dwResult==WAIT_OBJECT_0 + 1)
         while( PeekMessage( &uMessage, NULL, 0, 0, PM_REMOVE ) )
          if( uMessage.message == WM_QUIT )
            bDone = true;
          else
            DispatchMessage( &uMessage );
         else
             break;
       }
       ResetEvent(hWaitEvent);
       CloseHandle(hWaitEvent);   
//------------------------------------------------------------------------------------------------------
       hMutexControl = openMutex(SYNCHRONIZE, FALSE, "UpdateFinalePluginMutexControl");/////////???????
       if(hMutexControl!=0)
       {
         bRepeat=false;   
         ReleaseMutex(hMutexControl);
         CloseHandle(hMutexControl);
       }
      }
      while(bRepeat);

      ReleaseMutex(hMutex);
      CloseHandle(hMutex);
//-------------------------------------------------------------------------------------------------------
      return 0;  
    }                                //end:  if(!(nResult==ERROR_ALREADY_EXISTS))
 }                                    //end:  if(nOSVersion>=WINDOWS_VISTA)

 for(int nVersion=FINALE_LATEST_VERSION; nVersion>=FINALE_EARLIEST_VERSION; nVersion--)
  if(nVersion!=MISSING_VERSION)                       
  {                                                 //find all Finale versions on the computer
   if(nVersion>FINALE_2007)
   {
    strcpy(szSubkey, "SOFTWARE\\MakeMusic\\Finale"); 
   
    if(nVersion!=FINALE_2014_5)
      itoa(nVersion, szFinaleVersion, 10);
    else
      strcpy(szFinaleVersion, "2014.5");

    strcat(szSubkey, szFinaleVersion);
    lResult=RegopenKeyEx(HKEY_LOCAL_MACHINE, szSubkey, NULL, KEY_QUERY_VALUE, &hKeyResult);
    if(lResult==ERROR_SUCCESS)
    {
     lResult=RegQueryValueEx(hKeyResult, "InstallDir", NULL, &dwType, (LPBYTE)szFilePath, &dwSizeFilePath); 
     RegCloseKey(hKeyResult);
    }                                         //end:  if(lResult==ERROR_SUCCESS)
   }
   else
    if(nVersion==FINALE_2007)
    {
     strcpy(szSubkey, "SOFTWARE\\MakeMusic\\Finale"); 
     itoa(nVersion, szFinaleVersion, 10);
     strcat(szSubkey, szFinaleVersion);
     strcat(szSubkey, "\\InstallPath");
     lResult=RegopenKeyEx(HKEY_LOCAL_MACHINE, szSubkey, NULL, KEY_QUERY_VALUE, &hKeyResult);
     if(lResult==ERROR_SUCCESS)
     { 
      lResult=RegQueryValueEx(hKeyResult, "", NULL, &dwType, (LPBYTE)szFilePath, &dwSizeFilePath);

      RegCloseKey(hKeyResult);
      for(int n=0; n<dwSizeFilePath-4; n++)
       if((szFilePath[n]=='2')&&(szFilePath[n+1]=='0')&&(szFilePath[n+2]=='0')&&(szFilePath[n+3]=='7'))
         szFilePath[n+4]='\0';
     }                                          //end:  if(lResult==ERROR_SUCCESS)
    }                                          //end:  if(nVersion==FINALE_2007)
    else
    {                                               //begin:  if(nVersion<FINALE_2007)    
     strcpy(szSubkey, "SOFTWARE\\CodaMusic\\Finale"); 
     itoa(nVersion, szFinaleVersion, 10);
     strcat(szSubkey, szFinaleVersion);
     strcat(szSubkey, "\\InstallPath");
     lResult=RegopenKeyEx(HKEY_LOCAL_MACHINE, szSubkey, NULL, KEY_QUERY_VALUE, &hKeyResult);
     if(lResult==ERROR_SUCCESS)
     {
      lResult=RegQueryValueEx(hKeyResult, "", NULL, &dwType, (LPBYTE)szFilePath, &dwSizeFilePath);
                                  
      RegCloseKey(hKeyResult);
      for(int n=0; n<dwSizeFilePath-4; n++)
       if((szFilePath[n]=='2')&&(szFilePath[n+1]=='0')&&(szFilePath[n+2]=='0')&&
           ((szFilePath[n+3]=='4')||(szFilePath[n+3]=='5')||(szFilePath[n+3]=='6')))
         szFilePath[n+4]='\0';
     }                                      //end:  if(lResult==ERROR_SUCCESS)
    }                                     //end:  if(nVersion<FINALE_2007)

   if((lResult==ERROR_SUCCESS)&&(dwType==REG_SZ))
   {
    strcat(szFilePath, "\\Plug-ins\\*");
    if(FindFile(szFilePath, szPluginName))
    {
      DWORD dwVersionInfoSize;                                                           
      BYTE *pVersionInfo = NULL;
      VS_FIXEDFILEINFO  *pFileInfo = NULL;
      UINT  nLenFileInfo = 0;

      dwVersionInfoSize = GetFileVersionInfoSize( szFilePath, NULL );
      pVersionInfo = new BYTE[ dwVersionInfoSize ];
      GetFileVersionInfo( szFilePath, 0, dwVersionInfoSize, pVersionInfo );
      VerQueryValue( pVersionInfo, TEXT("\\"), (LPVOID*) &pFileInfo, &nLenFileInfo );

      DWORD dwLeftMost = HIWORD(pFileInfo->dwFileVersionMS);      
      DWORD dwSecondLeft = LOWORD(pFileInfo->dwFileVersionMS);    
      DWORD dwSecondRight = HIWORD(pFileInfo->dwFileVersionLS);   
      DWORD dwRightMost = LOWORD(pFileInfo->dwFileVersionLS);     

      pluginVersionInfo.bData[0]=(BYTE)dwRightMost;
      pluginVersionInfo.bData=(BYTE)dwSecondRight;
      pluginVersionInfo.bData=(BYTE)dwSecondLeft;
      pluginVersionInfo.bData=(BYTE)dwLeftMost;

      delete[]  pVersionInfo;

      if(pluginVersionInfo.dwData!=pluginVersionInfoNew.dwData)
      {
        SetFileAttributes(szFilePath, FILE_ATTRIBUTE_NORMAL);
        if(DeleteFile(szFilePath))                             
        {
          int nNullPos=strlen(szFilePath);
          for( ; nNullPos>=0; nNullPos--)
           if(szFilePath[nNullPos]=='\\')
             break;
          szFilePath[nNullPos+1]='\0';
          strcat(szFilePath, findNewFileData.cFileName);
          CopyFile(szCurrDir, szFilePath, false);                           
          bUpdate=true;
        }
        else
        {
          bCloseFinale=true;
          break; 
        }
      }
      nUpdateNums++;
    }
   }        //end:   if((lResult==ERROR_SUCCESS)&&(dwType==REG_SZ))
 }         //end:   for(int nVersion=FINALE_LAST_VERSION; nVersion>=FINALE_EARLIEST_VERSION; nVersion--)

 if(bCloseFinale)
 {
   strcpy(szUpdateText, "Close Finale ");
   strcat(szUpdateText, szFinaleVersion);
   strcat(szUpdateText, " and restart Update.");
   MessageBox( hUpdateWnd, szUpdateText, szCaption, MB_OK | MB_ICONSTOP );  
 }
 else
  if(nUpdateNums==0)
  {
    strcpy(szUpdateText, szPluginName);
    strcat(szUpdateText, " was not found.");
    MessageBox( hUpdateWnd, szUpdateText, szCaption, MB_OK | MB_ICONSTOP );  
  }
  else
   if(bUpdate)
     MessageBox( hUpdateWnd, "Update successfully completed.", szCaption, MB_OK | MB_ICONASTERISK );
   else
   {
     strcpy(szUpdateText, "You have the latest version of ");
     strcat(szUpdateText, szPluginName);
     strcat(szUpdateText, ".");
     MessageBox( hUpdateWnd, szUpdateText, szCaption, MB_OK | MB_ICONSTOP );
   }

Don't forget to replace "YourPluginName" with your real Finale plug-in name.
You can replace at the end of _tWinMain()

return (int) msg.wParam;

to

return 0;

In InitInstance() after

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
                                     CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

insert


   hInstallWnd = hWnd;
   nCmdShow=SW_SHOWMINIMIZED;

Here are the declared above functions:

bool __stdcall  FindFile(char szFilePath[], char szFileName[])
{
  HANDLE hFile;
  WIN32_FIND_DATA findFileData;
  int nNullPos=strlen(szFilePath);

  hFile=FindFirstFile(szFilePath, &findFileData);

  if (hFile!=INVALID_HANDLE_VALUE)
  {
   do                                 //begin:  do ... while (FindNextFile(hFile, &findFileData)!=0);
    if((strcmp(findFileData.cFileName, ".")!=0)&&(strcmp(findFileData.cFileName, "..")!=0))
    {
     if(findFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
     {
       szFilePath[nNullPos-1]='\0';
       strcat(szFilePath, findFileData.cFileName); 
       strcat(szFilePath, "\\*");

       if(FindFile(szFilePath, szFileName))
       {
         FindClose(hFile);
         return true;
       }
       else
       {
         szFilePath[nNullPos-1]='*';
         szFilePath[nNullPos]='\0';
       }
     }
     else
      if(strstr(findFileData.cFileName, szFileName)!=NULL)
      {
        szFilePath[nNullPos-1]='\0';
        strcat(szFilePath, findFileData.cFileName); 
        FindClose(hFile);
        return true;
      }
    }   //end:  if((strcmp(findFileData.cFileName, ".")!=0)&&(strcmp(findFileData.cFileName, "..")!=0))
   while (FindNextFile(hFile, &findFileData)!=0);

   szFilePath[nNullPos-1]='*';
   szFilePath[nNullPos]='\0';
   FindClose(hFile);
   return false;
  }
  else
    return false;
}

//************************************************************************************************************

VOID CALLBACK WaitTimerProc                                          
   (
    HWND hWnd,         // handle of window for timer messages
    UINT uMsg,        // WM_TIMER message
    UINT idEvent,    // timer identifier
    DWORD dwTime     // current system time
   )
{
   if(idEvent==WAIT_TIMER_IDENT)                          
   {
       KillTimer(hWnd, idEvent);
       SetEvent(hWaitEvent);    
   }
}
Back to Top

author
Registered Member

Email Address Not AvailableClick to visit author's website.Send a Private Message to authorAIM Not AvailableICQ Not AvailableY! Not AvailableMSN Not Available
Date Joined Mar 2015
Total Posts : 30
 
   Posted 3/21/2016 4:33 AM (GMT -5)    Quote This PostAlert An Admin About This Post.
Your plug-ins can be removed by this uninstaller. The user only need to click the uninstaller .exe-file and then follow the uninstall wizard.
If you work in Visual C++, create Win32 Project (Windows application). Add the following code:

#include "Shlobj.h"
#include "WinNT.h"
#include "KtmW32.h"        
#include "Shellapi.h"     

#define FINALE_EARLIEST_VERSION 2004                        //Finale 2004
#define FINALE_LATEST_VERSION   2015                        //Finale 2014.5
#define FINALE_2007             2007
#define FINALE_2014_5           2015
#define MISSING_VERSION         2013
#define WINDOWS_XP              5
#define WINDOWS_VISTA           6 
#define WAIT_TIMER_IDENT        999
#define SHELL_EXECUTE_WAIT_TIME 300

Then declare the global variables and functions:

HWND hUninstallWnd;
HANDLE hWaitEvent;
int nOSVersion;

bool __stdcall FindFile(char szFilePath[], char szFileName[]);
VOID CALLBACK WaitTimerProc(HWND hWnd, UINT uMsg, UINT idEvent, DWORD dwTime);

In _tWinMain() delete the Main message loop



    // Main message loop:

    while (GetMessage(&msg, NULL, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }


and instead insert the following code:

 char szPluginName[]="YourPluginName";  // replace "YourPluginName" with your real Finale plug-in name!!!
 char szCaption[256];
 strcpy(szCaption, "Uninstall ");
 strcat(szCaption, szPluginName);
 char szFilePath[MAX_PATH];
 DWORD dwSizeFilePath=sizeof(szFilePath); 
 LONG lResult;
 HKEY  hKeyResult=0;
 char szSubkey[128];
 char szFinaleVersion[16];
 DWORD dwType;
 char szUninstallText[256];
 WIN32_FIND_DATA findFileData;
 struct 
 {
  char* lpszFullPath;
  FILETIME creationTime; 
 } 
 plugins[24];
 int nPluginNums=0;
 int nDeletedPluginNums=0;

 LPOSVERSIONINFO lpVersionInformation=new OSVERSIONINFO;
 lpVersionInformation->dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
 GetVersionEx(lpVersionInformation);
 nOSVersion=(int)lpVersionInformation->dwMajorVersion;
 delete lpVersionInformation;

//--------------------------------------------------------------------------------------------------------------
 if(nOSVersion>=WINDOWS_VISTA)
 {
    HANDLE hMutexControl=0;
    HANDLE hMutex=CreateMutex(NULL, true, "UninstallFinalePluginMutex");
    int nResult=GetLastError();
    if(nResult==ERROR_ALREADY_EXISTS)
      hMutexControl=CreateMutex(NULL, true, "UninstallFinalePluginMutexControl");   
    else
    {
      char szUninstallModuleFileName[256];
      GetModuleFileName(NULL, szUninstallModuleFileName, sizeof(szUninstallModuleFileName));

      HINSTANCE hInstanceSE=ShellExecute(NULL, "runas", szUninstallModuleFileName, 0, 0, SW_SHOWNORMAL);
      //The app re-runs itself as admin 
//-------------------------------------------------------------------------------------------------------
      if((int)hInstanceSE<32)
      {
        ReleaseMutex(hMutex);
        CloseHandle(hMutex);
        MessageBox( hUninstallWnd, "Uninstall failed. Try to uninstall manually.", szCaption, MB_OK | MB_ICONSTOP );
        return 0;
      }
//------------------------------------------------------------------------------------------------------
      bool bRepeat=true;
      do
      {
        hWaitEvent=CreateEvent(NULL, true, false, NULL);
       MSG uMessage;
       DWORD dwResult;
       bool bDone=false;
       SetTimer(hUninstallWnd, WAIT_TIMER_IDENT, SHELL_EXECUTE_WAIT_TIME, (TIMERPROC)WaitTimerProc);
              
       while( !bDone )
       {
        dwResult = MsgWaitForMultipleObjects( 1, &hWaitEvent, false, INFINITE, QS_ALLINPUT );
        if(dwResult==WAIT_OBJECT_0 + 1)
         while( PeekMessage( &uMessage, NULL, 0, 0, PM_REMOVE ) )
          if( uMessage.message == WM_QUIT )
            bDone = true;
          else
            DispatchMessage( &uMessage );
         else
             break;
       }
       ResetEvent(hWaitEvent);
       CloseHandle(hWaitEvent);   
//------------------------------------------------------------------------------------------------------
       hMutexControl = openMutex(SYNCHRONIZE, FALSE, "UninstallFinalePluginMutexControl");/////////???????
       if(hMutexControl!=0)
       {
         bRepeat=false;   
         ReleaseMutex(hMutexControl);
         CloseHandle(hMutexControl);
       }
      }
      while(bRepeat);

      ReleaseMutex(hMutex);
      CloseHandle(hMutex);
//-------------------------------------------------------------------------------------------------------
      return 0;  
    }                                //end:  if(!(nResult==ERROR_ALREADY_EXISTS))
 }                                    //end:  if(nOSVersion>=WINDOWS_VISTA)

//----------------------------------------------------------------------------------------------------------------------

 for(int nVersion=FINALE_LATEST_VERSION; nVersion>=FINALE_EARLIEST_VERSION; nVersion--)
  if(nVersion!=MISSING_VERSION)                       
  {                                                 //find all Finale versions on the computer
   if(nVersion>FINALE_2007)
   {
    strcpy(szSubkey, "SOFTWARE\\MakeMusic\\Finale"); 
   
    if(nVersion!=FINALE_2014_5)
      itoa(nVersion, szFinaleVersion, 10);
    else
      strcpy(szFinaleVersion, "2014.5");

    strcat(szSubkey, szFinaleVersion);
    lResult=RegopenKeyEx(HKEY_LOCAL_MACHINE, szSubkey, NULL, KEY_QUERY_VALUE, &hKeyResult);
    if(lResult==ERROR_SUCCESS)
    {
     lResult=RegQueryValueEx(hKeyResult, "InstallDir", NULL, &dwType, (LPBYTE)szFilePath, &dwSizeFilePath); 
     RegCloseKey(hKeyResult);
    }              //end:  if(lResult==ERROR_SUCCESS)
   }
   else
    if(nVersion==FINALE_2007)
    {
     strcpy(szSubkey, "SOFTWARE\\MakeMusic\\Finale"); 
     itoa(nVersion, szFinaleVersion, 10);
     strcat(szSubkey, szFinaleVersion);
     strcat(szSubkey, "\\InstallPath");
     lResult=RegopenKeyEx(HKEY_LOCAL_MACHINE, szSubkey, NULL, KEY_QUERY_VALUE, &hKeyResult);
     if(lResult==ERROR_SUCCESS)
     { 
      lResult=RegQueryValueEx(hKeyResult, "", NULL, &dwType, (LPBYTE)szFilePath, &dwSizeFilePath);

      RegCloseKey(hKeyResult);
      for(int n=0; n<dwSizeFilePath-4; n++)
       if((szFilePath[n]=='2')&&(szFilePath[n+1]=='0')&&(szFilePath[n+2]=='0')&&(szFilePath[n+3]=='7'))
         szFilePath[n+4]='\0';
     }                           //end:  if(lResult==ERROR_SUCCESS)
    }                           //end:  if(nVersion==FINALE_2007)
    else
    {                           //begin:  if(nVersion<FINALE_2007)    
     strcpy(szSubkey, "SOFTWARE\\CodaMusic\\Finale"); 
     itoa(nVersion, szFinaleVersion, 10);
     strcat(szSubkey, szFinaleVersion);
     strcat(szSubkey, "\\InstallPath");
     lResult=RegopenKeyEx(HKEY_LOCAL_MACHINE, szSubkey, NULL, KEY_QUERY_VALUE, &hKeyResult);
     if(lResult==ERROR_SUCCESS)
     {
      lResult=RegQueryValueEx(hKeyResult, "", NULL, &dwType, (LPBYTE)szFilePath, &dwSizeFilePath);
                                  
      RegCloseKey(hKeyResult);
      for(int n=0; n<dwSizeFilePath-4; n++)
       if((szFilePath[n]=='2')&&(szFilePath[n+1]=='0')&&(szFilePath[n+2]=='0')&&
           ((szFilePath[n+3]=='4')||(szFilePath[n+3]=='5')||(szFilePath[n+3]=='6')))
         szFilePath[n+4]='\0';
     }                           //end:  if(lResult==ERROR_SUCCESS)
    }                           //end:  if(nVersion<FINALE_2007)

   if((lResult==ERROR_SUCCESS)&&(dwType==REG_SZ))
   {
    strcat(szFilePath, "\\Plug-ins\\*");
    if(FindFile(szFilePath, szPluginName))
    {
      plugins[nPluginNums].lpszFullPath=new char[256];
      strcpy(plugins[nPluginNums].lpszFullPath, szFilePath); 
      plugins[nPluginNums].creationTime=findFileData.ftCreationTime;
      nPluginNums++;
    }
   }        //end:   if((lResult==ERROR_SUCCESS)&&(dwType==REG_SZ))
 }         //end:   for(int nVersion=FINALE_LAST_VERSION; nVersion>=2004; nVersion--)

 if(nPluginNums==0)
 {
   strcpy(szUninstallText,  szPluginName);
   strcat(szUninstallText, " was not found.");
   MessageBox( hUninstallWnd, szUninstallText, szCaption, MB_OK | MB_ICONSTOP );  
 }
 else
 {
   for(int nNum=0; nNum<nPluginNums; nNum++)
   {
     if(nPluginNums==1)
     {
      strcpy(szUninstallText,  "Are you sure you want to remove ");
      strcat(szUninstallText,  szPluginName);
      strcat(szUninstallText,  "?");
     }
     else
     {
        strcpy(szUninstallText, "Are you sure you want to remove ");
        strcat(szUninstallText,  szPluginName);
        strcat(szUninstallText,  " from Finale ");
        int nFullPath=strlen(plugins[nNum].lpszFullPath);

        for(int n=0; n<nFullPath; n++)
         if(((char)*(plugins[nNum].lpszFullPath+n)=='2')&&
            ((char)*(plugins[nNum].lpszFullPath+n+1)=='0')&&
            ((char)*(plugins[nNum].lpszFullPath+n+2)>='0')&&
            ((char)*(plugins[nNum].lpszFullPath+n+2)<='9')&&
            ((char)*(plugins[nNum].lpszFullPath+n+3)>='0')&&
            ((char)*(plugins[nNum].lpszFullPath+n+3)<='9'))
         {
           szFinaleVersion[0]=(char)*(plugins[nNum].lpszFullPath+n);
           szFinaleVersion=(char)*(plugins[nNum].lpszFullPath+n+1);
           szFinaleVersion=(char)*(plugins[nNum].lpszFullPath+n+2);
           szFinaleVersion=(char)*(plugins[nNum].lpszFullPath+n+3);
           szFinaleVersion='\0';
           if(((char)*(plugins[nNum].lpszFullPath+n+2)=='1')&&
              ((char)*(plugins[nNum].lpszFullPath+n+3)=='4')&&
              ((char)*(plugins[nNum].lpszFullPath+n+4)=='.')&&
              ((char)*(plugins[nNum].lpszFullPath+n+5)=='5'))
             strcat(szFinaleVersion, ".5"); 

           strcat(szUninstallText, szFinaleVersion); 
           strcat(szUninstallText, "?");
           break;
         }
     }
     int nDialogRetValue=MessageBox( hUninstallWnd, szUninstallText, szCaption,
                                     MB_YESNOCANCEL | MB_ICONQUESTION | MB_DEFBUTTON1 );

     if(nDialogRetValue==IDYES)
     {
      WIN32_FIND_DATA findDirData;
      HANDLE hDir;

      SetFileAttributes(plugins[nNum].lpszFullPath, FILE_ATTRIBUTE_NORMAL);
      if(DeleteFile(plugins[nNum].lpszFullPath))  
      {
//************************************** if you want to delete the empty folder *****************************//begin
        ULONGLONG qwFileTime, qwDirTime;
        qwFileTime = (((ULONGLONG) plugins[nNum].creationTime.dwHighDateTime) << 32) + 
                                   plugins[nNum].creationTime.dwLowDateTime;
        qwFileTime>>=24;
        int nNullPos=strlen(plugins[nNum].lpszFullPath);
        for( ; nNullPos>=0; nNullPos--)
         if((char)*(plugins[nNum].lpszFullPath+nNullPos)=='\\')
         {
           (char)*(plugins[nNum].lpszFullPath+nNullPos)='\0';
           break;
         }

        hDir=FindFirstFile(plugins[nNum].lpszFullPath, &findDirData);
        if (hDir!=INVALID_HANDLE_VALUE)
        {
          qwDirTime = (((ULONGLONG) findDirData.ftCreationTime.dwHighDateTime) << 32) + 
                                    findDirData.ftCreationTime.dwLowDateTime;
          qwDirTime>>=24;
          if(qwFileTime-qwDirTime<600)       //if the folder was created in less than 10min before the file 
            RemoveDirectory(plugins[nNum].lpszFullPath);

          FindClose(hDir);
        }
//****************************************************************************************************************//end
        nDeletedPluginNums++;
        MessageBox( hUninstallWnd, "Uninstall successfully completed.", szCaption, MB_OK | MB_ICONASTERISK );
      }
      else
      {
        strcpy(szUninstallText, "Close Finale ");
        strcat(szUninstallText, szFinaleVersion);
        strcat(szUninstallText, " and restart Uninstall.");
        MessageBox( hUninstallWnd, szUninstallText, szCaption, MB_OK | MB_ICONASTERISK );
        for( ; nNum<nPluginNums; nNum++)
         delete[] plugins[nNum].lpszFullPath;
        break;
      }
     }
     else
      if(nDialogRetValue==IDCANCEL)
      {
        for( ; nNum<nPluginNums; nNum++)
         delete[] plugins[nNum].lpszFullPath;
        break;
      }

     delete[] plugins[nNum].lpszFullPath; 
   }                                       //end:   for(int nNum=0; nNum<nPluginNums; nNum++)

//************************** if your plug-in created the registry keys or ini-files ***************************//begin
   if(nDeletedPluginNums==nPluginNums)
   {
     RegDeleteKey(HKEY_CURRENT_USER, "SOFTWARE\\YourPluginName");  //delete subkey YourPluginName from 
                                                                   //the registry key HKEY_CURRENT_USER
     RegDeleteKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\YourPluginName");  //delete subkey YourPluginName from
                                                                    //the registry key HKEY_LOCAL_MACHINE  
     LPVOID lpvEnv;                                   
     lpvEnv = GetEnvironmentStrings();
     char* szPluginIniName=new char[MAX_PATH];
     char* szPluginAllUsersIniName=new char[MAX_PATH];                           

     GetEnvironmentVariable("APPDATA", szPluginIniName, MAX_PATH);  
     GetEnvironmentVariable("ALLUSERSPROFILE", szPluginAllUsersIniName, MAX_PATH);
     if(nOSVersion==WINDOWS_XP)
       strcat(szPluginAllUsersIniName, "\\Application Data");

     FreeEnvironmentStrings((LPTSTR)lpvEnv);
     char* szPathTemp=new char[256];

     strcpy(szPathTemp, szPluginIniName);
     strcat(szPathTemp, "\\YourName");
     strcat(szPathTemp, "\\YOURPLUGINNAME.INI");
     if(DeleteFile(szPathTemp))                    //delete the file YOURPLUGINNAME.INI from APPDATA   
     {
       strcpy(szPathTemp, szPluginIniName);
       strcat(szPathTemp, "\\YourName");
       RemoveDirectory(szPathTemp);                   //delete the folder YourFolderName  from APPDATA
     }   

     strcpy(szPathTemp, szPluginAllUsersIniName);
     strcat(szPathTemp, "\\YourName");
     strcat(szPathTemp, "\\YOURPLUGINNAME.INI");
     if(DeleteFile(szPathTemp))                //delete the file YOURPLUGINNAME.INI from ALLUSERSPROFILE
     {
       strcpy(szPathTemp, szPluginAllUsersIniName);
       strcat(szPathTemp, "\\YourName");
       RemoveDirectory(szPathTemp);                //delete the folder YourFolderName from ALLUSERSPROFILE
     }

     delete[] szPathTemp;
     delete[] szPluginIniName;
     delete[] szPluginAllUsersIniName;
   }                                      //end:  if(nDeletedPluginNums==nPluginNums)
//**************************************************************************************************************//end
 }                                     //end:  if(nPluginNums>0)

Don't forget to replace "YourPluginName" and "YourFolderName" with the real names.
You can replace at the end of _tWinMain()


return (int) msg.wParam;


to


return 0;


In InitInstance() after


   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
                                     CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);


insert



   hInstallWnd = hWnd;
   nCmdShow=SW_SHOWMINIMIZED;


Here are the declared above functions:

bool __stdcall  FindFile(char szFilePath[], char szFileName[])
{
  HANDLE hFile;
  WIN32_FIND_DATA findFileData;
  int nNullPos=strlen(szFilePath);

  hFile=FindFirstFile(szFilePath, &findFileData);

  if (hFile!=INVALID_HANDLE_VALUE)
  {
   do                                 //begin:  do ... while (FindNextFile(hFile, &findFileData)!=0);
    if((strcmp(findFileData.cFileName, ".")!=0)&&(strcmp(findFileData.cFileName, "..")!=0))
    {
     if(findFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
     {
       szFilePath[nNullPos-1]='\0';
       strcat(szFilePath, findFileData.cFileName); 
       strcat(szFilePath, "\\*");

       if(FindFile(szFilePath, szFileName))
       {
         FindClose(hFile);
         return true;
       }
       else
       {
         szFilePath[nNullPos-1]='*';
         szFilePath[nNullPos]='\0';
       }
     }
     else
      if(strstr(findFileData.cFileName, szFileName)!=NULL)
      {
        szFilePath[nNullPos-1]='\0';
        strcat(szFilePath, findFileData.cFileName); 
        FindClose(hFile);
        return true;
      }
    }   //end:  if((strcmp(findFileData.cFileName, ".")!=0)&&(strcmp(findFileData.cFileName, "..")!=0))
   while (FindNextFile(hFile, &findFileData)!=0);

   szFilePath[nNullPos-1]='*';
   szFilePath[nNullPos]='\0';
   FindClose(hFile);
   return false;
  }
  else
    return false;
}

//************************************************************************************************

VOID CALLBACK WaitTimerProc                                          
   (
    HWND hWnd,         // handle of window for timer messages
    UINT uMsg,        // WM_TIMER message
    UINT idEvent,    // timer identifier
    DWORD dwTime     // current system time
   )
{
   if(idEvent==WAIT_TIMER_IDENT)                          
   {
       KillTimer(hWnd, idEvent);
       SetEvent(hWaitEvent);    
   }
}

Post Edited (author) : 3/21/2016 1:37:19 PM (GMT-5)

Back to Top
You cannot post new topics in this forum. You cannot reply to topics in this forum. Printable Version
   
Forum Information
Currently it is Saturday, October 21, 2017 2:38 AM (GMT -5)
There are a total of 437,650 posts in 63,789 threads.
In the last 3 days there were 0 new threads and 0 reply posts. View Active Threads