Textdatei mit in der exe-Datei Anbinden

rano

Mitglied
Ich lese Text aus einer Datei nach dem erstellen habe ich Eine exe-Datei und die Textdatei. Und mien Frage:
gibt es die Möglischkeit Die Datei mit in der Exe zu bekommen (d.h. am ende soll ich nur eine Exe Datei haben.?

Warum : Die Textdatei soll Lösungen für aufgaben (Also man soll nicht die datei mit editor öffnen und die Lösungen sehen)

Danke
 
Du kannst die Textdatei in die Ressourcen packen. Die musst du dann allerdings per Hand laden (bei einem eigenen Ressourcen-Typ).

Beachte aber, dass in dem Fall die Texte immer noch lesbar sind, wenn man die EXE in einem Hex-Editor öffnet.
 
Also man kann das am Ende der .exe anfügen.
Beispiel du nimmst die lezten 32Bit für einen Offset von hinten somit weißt du dann, wo dein "Text-Content" inerhalb der exe anfängt.
Allerdings würde ich dir eher zu einer "billigen" Verschlüsselung raten, das ist denke ich einfacher und besser, als an die .exe anhängen.

Gruß Homer
P.S. sowas gabs schon mal hier, suche mal im Forum!
 
zum Öffnen oder Lesen ..der Datei gebe ich normalerweise "test.txt" was wedre ich dann als datei name eingeben wenn im ressourcen gepackt.?
 
Zu kannst (zumindest in Visual Studio) einfach im Menü oben Projekt->Ressource hinzufügen.
Dort kommt dann ein Dialog mit links einer kleinen Auswahl an vordefinierten Typen und rechts ein paar Buttons. Dort wählst du Importieren. Wähle deine Text-Datei.

Im nächsten Dialog gib als Typ zum Beispiel RT_TEXT ein. Jetzt hast du in deiner EXE diese Datei included.

Zum Laden:

Das Laden über File-Funktionen geht da natürlich nicht mehr. Du kannst dir über die Windows-Funktionen allerdings einen Pointer auf die Daten in der Exe holen.

Code:
  HMODULE hModule = GetModuleHandle( NULL );

  // Hier die ID der Datei in den Ressourcen und als letzten Parameter den Typ angeben:
  HRSRC hrSrc = FindResource( hModule, MAKEINTRESOURCE( ID_DEINES_TEXTES ), "RT_TEXT" );
  HGLOBAL   hGlob = LoadResource( hModule, hrSrc );

  DWORD     dwSizeOfResource = SizeofResource( hModule, hrSrc );

  // + 1, da der Text in den Ressourcen KEINEN Null-Terminator enthält
  char*     cFertigerText = new char[dwSizeOfResource + 1];

  char*     cTextInResource = (char*)LockResource( hGlob );

  // rauskopieren
  memcpy( cFertigerText, cTextInResource, dwSizeOfResource );

  // Null-Terminator setzen
  cFertigerText[dwSizeOfResource] = 0;

  // cTextInResource ist ab jetzt nicht mehr benutzbar
  UnlockResource( hGlob );

  // Mit cFertigerText arbeiten
  dh::Log( cFertigerText );

  // ...und wieder freigeben
  delete[] cFertigerText;
 
Danke, ich lerne hier total was neues. eine Frage habe ich noch. du hast das Text in eine char* cFertigerText gespeichert. sind auch die Stuerzeichen (return ) mit gespeichert?
warum: ich sollte normalerweise die textdatei zeilenweise einlesen?

warum hast du char* und nicht string oder CString benutzt?
 
Wenn du die Datei so includest, ist die komplett mit allen Steuerzeichen gespeichert. Die Zeilenumbrüche (returns) sind genauso drin.

Ich verwende std::string wo ich kann, aber dem kann ich die direkte Zuweisung nicht geben, da in den Ressourcen keine abschliessende 0 drin ist (der std::string würde solange im Speicher lesen, bis dann doch irgendwann eine 0 kommt).

ANSHIRNKLATSCH! (Geräusch):
Hab grade nochmal nachgeguggt, der std::string hat eine append-Funktion. Schmeiss das hässliche new und delete mit cFertigerText weg. Äbäh!

statt dessen:

std::string strMeineTextDatei;

strMeineTextDatei.append( cTextInResource, dwSizeOfResource );

Keine Sorgen um Speicherlecks, kein hässlicher char* mehr. Manchmal ist es so einfach.
Der std::string enthält jetzt natürlich die komplette Text-Datei, müsste also noch Zeilenweise zerlegt werden. Aber das dürfte ja kein Problem sein.
 
Du könntest auch einfach einen entsprechenden (Range-)Konstruktor (Vorsicht bei VC6) oder die assign()-Methode verwenden, um sowas an einen std::string zuzuweisen.

Nebenbei: Gute Arbeit, Endurion! Du bist eine Stütze der Community! *ernst mein*
 
ich habe einen test anwendung erstellt mit diesem code . er soll einfach das gelesene string wiedergeben.
Code:
	HMODULE hModule = GetModuleHandle( NULL );

  // Hier die ID der Datei in den Ressourcen und als letzten Parameter den Typ angeben:
  HRSRC hrSrc = FindResource( hModule, MAKEINTRESOURCE( ID_DEINES_TEXTES ),"RT_TEXT");
  HGLOBAL   hGlob = LoadResource( hModule, hrSrc );

  DWORD dwSizeOfResource = SizeofResource( hModule, hrSrc );
	char* cTextInResource = (char*)LockResource( hGlob );
  
	
   std::string strMeineTextDatei;

	strMeineTextDatei.append( cTextInResource, dwSizeOfResource );
	m_ausgabe=strMeineTextDatei.c_str();
	UpdateData(FALSE);
	UnlockResource( hGlob );

leider bekomme ich eine Konvertierungsfhler:

rror C2664: 'FindResourceW' : Konvertierung des Parameters 3 von 'char [8]' in 'const unsigned short *' nicht moeglich
Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
Fehler beim Ausführen von cl.exe.

readfileDlg.obj - 1 Fehler, 0 Warnung(en)
 
Zurück