void ExtractFile(char *FileName, int ResType, int ResId) { HANDLE FH = CreateFile(FileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); if (FH == INVALID_HANDLE_VALUE) return; if (!ExtractFileFromResource(FH, ResType, ResId, NULL)) MessageBoxA(0, "Can't extract", "!!!", MB_OK); CloseHandle(FH); }
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { lpCmdLine = GetCommandLine(); LANGID gLangid; TCHAR sz32bitExeCommand[MAX_PATH] = {0} ; TCHAR sz64bitExeCommand[MAX_PATH] = {0} ; TCHAR sz32bitExeName[MAX_PATH] = {0} ; TCHAR sz64bitExeName[MAX_PATH] = {0} ; TCHAR sz32ExecutableName[MAX_PATH] = {0} ; TCHAR sz64ExecutableName[MAX_PATH] = {0} ; TCHAR command[BUFFER_SIZE] = {0} ; TCHAR szDirName[BUFFER_SIZE] = {0} ; int i64bitError = ERROR_SUCCESS; int i32bitError = ERROR_SUCCESS; for (int i=1; i< __argc; i++) { lstrcat(command, __argv[i]); lstrcat(command, " "); } wsprintf(sz32bitExeName, JRE_32BIT_INSTALLER); wsprintf(sz64bitExeName, JRE_64BIT_INSTALLER); //Verify if it's 64-bit OS before extraction of 64-bit installer if(IsSystem64bit()) { GetCobundleFileName(sz64ExecutableName, szDirName, sz64bitExeName); if (ExtractFileFromResource(hInstance, MAKEINTRESOURCE(IDP_INSTALLER_64), "JAVA_64_INSTALLER", sz64ExecutableName)) { wsprintf(sz64bitExeCommand, "%s %s", sz64ExecutableName, command); i64bitError = ExecCommand(sz64bitExeCommand); } ::DeleteFile(sz64ExecutableName); } //Get the destination directory and file path for the extracted 32-bit installer GetCobundleFileName(sz32ExecutableName, szDirName, sz32bitExeName); if (ExtractFileFromResource(hInstance, MAKEINTRESOURCE(IDP_INSTALLER_32), "JAVA_32_INSTALLER", sz32ExecutableName)) { //Form the installer command wsprintf(sz32bitExeCommand, "%s %s", sz32ExecutableName, command); //Install 32-bit jre i32bitError = ExecCommand(sz32bitExeCommand); } //Remove the extracted installer executable file ::DeleteFile(sz32ExecutableName); //Remove the combo directory ::RemoveDirectory(szDirName); //if the 32-bit install fails return its error code, otherwise return the 64-bit error code. if (i32bitError != 0) { return i32bitError; }else { return i64bitError; } }