Binärdatei aus Ressource extrahieren



  • Hallo Freunde des gepflegten Windows,
    ich muss mich etwas zu meinem Widerwillen mit der C-API von Windows befassen und folgendes Problem lösen:
    Eine als Ressource in die exe eingepackte Datei soll nach Userklick auf dessen Zielmaschine kopiert werden.
    Damit nicht der Verdacht besteht ich führe böses im Schilde, lasst euch gesagt sein, das es sich um eine msi-Database handelt.
    Nun, ich habe gesehen, dass es mit MFC funktioniert, da ich aber nicht mit MFC arbeiten darf, wollte ich fragen, ob jemand mir sagen kann, wie das mit der C-API möglich ist!
    Danke Euch
    AkonF





  • // Extrahiere die neue Datei aus den Resourcen:
      HRSRC hRes = FindResource(NULL, MAKEINTRESOURCE(IDR_BIN1), _T("BIN"));
      if (hRes == NULL)
      {
        if (bSilent == false)
        {
          _stprintf(szMsg, _T("Internal error (1: resource not found)!"));
          MessageBox(NULL, szMsg, _T("Aborted"), MB_ICONHAND | MB_OK);
        }
        return 1;  // error
      }
    
      HGLOBAL hResLoaded = LoadResource(NULL, hRes);
      if (hResLoaded == NULL)
      {
        if (bSilent == false)
        {
          _stprintf(szMsg, _T("Internal error (2: resource not found)!"));
          MessageBox(NULL, szMsg, _T("Aborted"), MB_ICONHAND | MB_OK);
        }
        return 1;  // error
      }
    
      DWORD dwResSize = SizeofResource(NULL, hRes);
      if (dwResSize == 0)
      {
        if (bSilent == false)
        {
          _stprintf(szMsg, _T("Internal error (3: resource not found)!"));
          MessageBox(NULL, szMsg, _T("Aborted"), MB_ICONHAND | MB_OK);
        }
        return 1;  // error
      }
    
      LPVOID pData = LockResource(hResLoaded);
      if (pData == NULL)
      {
        if (bSilent == false)
        {
          _stprintf(szMsg, _T("Internal error (4: resource not found)!"));
          MessageBox(NULL, szMsg, _T("Aborted"), MB_ICONHAND | MB_OK);
        }
        return 1;  // error
      }
    
      HANDLE hTemp = CreateFile(szNewFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
      if (hTemp == INVALID_HANDLE_VALUE)
      {
        if (bSilent == false)
        {
          _stprintf(szMsg, _T("Could not create new-file (%s)!"), szNewFile);
          MessageBox(NULL, szMsg, _T("Aborted"), MB_ICONHAND | MB_OK);
        }
        return 1;  // error
      }
    
      DWORD dwBytesWritten;
      if (WriteFile(hTemp, pData, dwResSize, &dwBytesWritten, NULL) == FALSE)
      {
        if (bSilent == false)
        {
          _stprintf(szMsg, _T("Could not write new-file (%s)!"), szNewFile);
          MessageBox(NULL, szMsg, _T("Aborted"), MB_ICONHAND | MB_OK);
        }
        CloseHandle(hTemp);
        UnlockResource(hResLoaded);
        DeleteFile(szNewFile);
        return 1;  // error
      }
      CloseHandle(hTemp);
      UnlockResource(hResLoaded);
    


  • Das Problem ist, dass ich damit noch nie gearbeitet habe und ehe ich mir ein Tutorial reinziehe und es am Ende doch nicht funktioniert. Danke aber für Eure Antworten. Aber irgendwie muckt der Resourcecompiler RC.exe vom Platform SDK.
    Der wirft ständig einen Fatal Error und meint, dass er ein unerwartetes Ende gefunden hat. MSDN hilft da nicht wirklich weiter. Ihr vielleicht?



  • Sry, letzte Frage hat sich erledigt 🙂


Anmelden zum Antworten