Avatar billede the_fox Nybegynder
15. juli 2006 - 09:53 Der er 11 kommentarer og
1 løsning

Inkludere .exe fil som en ressource?

Hej Eksperter!

Hvis overskriften ikke giver mening, så er det jeg ønsker følgende:
Jeg vil inkludere msjavx86_ver3805.exe til mit program så den ikke ligger ved siden af. På den måde kan jeg starte msjavx86_ver3805.exe med parameteren /Q så man er fri for licensaftale og alt det skidt.

Jeg har søgt lidt på en løsning, men har ikke rigtig fundet noget. Jeg læste at man kunne inkludere exe-filen som en binær ressource og "bare" skrive msjavx86_ver3805.exe til harddisken midlertidig når man skal bruge den, men kan det ikke gøre nemmere?

Mvh Ole
Avatar billede bertelbrander Novice
16. juli 2006 - 01:20 #1
Du kan sansynligvis godt finde Win32 API funktioner til at loade og eksekvere et program fra en resource men jeg tvivler meget på at det er lettere.

Hvorfor bruger du ikke bare en genvej eller en .bat fil?
Avatar billede the_fox Nybegynder
16. juli 2006 - 19:27 #2
Programmet skal også udføre andet end lige at køre denne fil og fordelen ved dette program skal være at der kun er én fil. Og at man kun skal trykke én gang for at den udfører en masse opgaver. :)

Mht. at inkludere filen binært. Har du så et forslag til hvordan man kommer igang med sådan en operation? Og hvordan man skriver den til harddisken efterfølgende?

Nogle links eller kode eksempler vil være perfekt.

Mvh Ole
Avatar billede bertelbrander Novice
17. juli 2006 - 01:41 #3
Du kan lave en .cpp fil, kaldet executer.cpp med:

#include <iostream>
#include <windows.h>
#include <stdio.h>

int main()
{
  HRSRC ResHandle = FindResource(0, MAKEINTRESOURCE(1025), RT_RCDATA);
  if(!ResHandle)
  {
      std::cerr << "Failed to find resource" << std::endl;
      std::cin.get();
      return 1;
  }

  HGLOBAL Res = LoadResource(0, ResHandle);
  if(!Res)
  {
      std::cerr << "Failed to load resource" << std::endl;
      std::cin.get();
      return 1;
  }
  void *Ptr = LockResource(Res);
  if(!Ptr)
  {
      std::cerr << "Failed to lock resource" << std::endl;
      std::cin.get();
      return 1;
  }
  DWORD Size = SizeofResource(0, ResHandle);

  FILE* ExeFile = fopen("somename.exe", "wb");
  if(!ExeFile)
  {
      std::cerr << "Failed to open the executeable file" << std::endl;
      std::cin.get();
      return 2;
  }

  fwrite(Ptr, 1, Size, ExeFile);
  fclose(ExeFile);
  STARTUPINFO StartupInfo;
  memset(&StartupInfo, 0, sizeof(StartupInfo));
  PROCESS_INFORMATION ProcessInformation;
  memset(&ProcessInformation, 0, sizeof(ProcessInformation));

  if(!CreateProcess("somename.exe", "", 0, 0, FALSE, NORMAL_PRIORITY_CLASS, 0, 0, &StartupInfo, &ProcessInformation))
  {
      std::cerr << "Failed to create process" << std::endl;
      std::cin.get();
      return 1;
  }
  WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
  remove("somename.exe");
}

Og en .rc fil, kaldet executer.rc med:

#include <windows.h>
1025 10 MOVEABLE PURE "/Programmer/Internet Explorer/iexplore.exe"

Og bygge med (hvis du bruger gcc):

g++ -c -O2 -Wall -W -Wno-unused -o executer.o executer.cpp
windres -i executer.rc -J rc -o executer.res -O coff
g++ executer.o executer.res -o executer.exe

Når du så kører executer.exe vil den skrive kopien af internet explorer på disken, køre den, vente på at den er færdig, og til slut slette den.
Avatar billede the_fox Nybegynder
17. juli 2006 - 21:33 #4
Jeg bruger ikke g++, men IDE'en Code::Blocks. Jeg kan godt kompilere koden, men jeg kan ikke køre programmet. Der står bare følgende:

Process terminated with status 1 (0 minutes, 0 seconds)
0 errors, 0 warnings

Jeg er forresten ved at lave en WIN32 API, kan det have nogen indflydelse?

Mvh Ole
Avatar billede the_fox Nybegynder
17. juli 2006 - 21:39 #5
jeg har en knap som udløser den kode du har skrevet ovenfor, men programmet starter slet ikke. :(
Avatar billede bertelbrander Novice
17. juli 2006 - 21:45 #6
Code::Blocks bruger normalt G++

Prøv at sætte et breakpoint og single-step dig igennem koden så du kan se hvor langt programmet kommer.

Har du inkluderet .rc filen i projectet?

Du skal måske rette stien til Internet Explorer.

Jeg kan godt prøve at lave et Code::Blocks project så du kan se hvordan det kan gøres, men det bliver først sent i aften.
Avatar billede the_fox Nybegynder
17. juli 2006 - 23:21 #7
Ok! Jeg prøver lige at kigge på det i morgen. Det ville være rart med et Code::Blocks eksempel og gerne win32 hvis du har tid? Men det er ikke noget du skal sidde oppe hele natten for at lave. :)
Forresten så har jeg inkluderet .rc filen og ændret stien til explorer, men det ændrer ikke noget. Indtil videre mange tak for hjælpen, det er bare klasse Mvh Ole
Avatar billede bertelbrander Novice
18. juli 2006 - 00:00 #8
Jeg har fået lavet et project med en meget simpel Win32 GUI (en knap).

Jeg ville lægge det ud på min hjemmeside, men den er fuld, så jeg kan ikke oploade mere :-(

Hvis du har en email adresse kan jeg sende det.
Avatar billede bertelbrander Novice
18. juli 2006 - 00:22 #9
Nå, jeg fik lavet lidt plads på serveren, så projectet kan hentes her:

http://home20.inet.tele.dk/midgaard/starter.zip
Avatar billede the_fox Nybegynder
18. juli 2006 - 08:57 #10
Jamen det ruller jo bare!! Det er sgu lækkert! Kan du ikke smide et svar, så hælder jeg lige lidt flere points oveni.
Avatar billede bertelbrander Novice
18. juli 2006 - 23:18 #11
Jeg samler ikke på point.
Avatar billede the_fox Nybegynder
19. juli 2006 - 09:31 #12
Ok, det har jeg også læst at du har skrevet i andre Spørgsmål, så det kan jeg jo ikke gøre meget ved. :) Men MANGE tak for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester