Autor Beitrag
Alibi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 458

Win2K SP3
Delphi 6 Ent
BeitragVerfasst: So 31.08.03 16:20 
Hi,
ansich dachte ich, die Funktion ist wirklich simpel, aber sie will partout hier nicht funktionieren.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
if FindResource(hInstance, 'MeinName', RT_RCDATA ) <> 0 then
  write('wow'
else
  write('boo!');


Laut ResHacker existiert die Resource, da ist nicht der Fehler. Aber die Funktion will und will die Resource nicht finden?


Zuletzt bearbeitet von Alibi am So 31.08.03 21:06, insgesamt 1-mal bearbeitet
Alibi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 458

Win2K SP3
Delphi 6 Ent
BeitragVerfasst: So 31.08.03 17:01 
Ok, laut GetLastError bekomme ich da immer den Errorcode 1814 -> Irgendwas stimmt nicht mit dem LanguageIndentifier der Resource.
Diese wird so von einem anderen Programm in eine Exe geschrieben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
  Data := '';

  AssignFile(TheFile,ParamStr(1));
  Reset(TheFile);
  while not EOF(TheFile) do
  begin
    ReadLn(TheFile, tmp);
    Data := PChar(Data + tmp);
  end;
  CloseFile(TheFile);

  ResH := BeginUpdateResource('EineExe.Exe', true);

  UpdateResource(
    ResH,  // update-file handle
    RT_RCDATA,  // address of resource type to update
    'MeinName',  // address of resource name to update
    MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),  // language identifier of resource
    Data,  // address of resource data
    Length(Data)  // length of resource data, in bytes
   );

   EndUpdateResource(ResH, false);

MakeLangID hab ich hier im Forum gefunden:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
function MAKELANGID(usPrimaryLanguage, usSubLanguage: BYTE): WORD; 
begin 
  Result := (usSubLanguage shl 10or usPrimaryLanguage; 
end;


Zuletzt bearbeitet von Alibi am So 31.08.03 17:04, insgesamt 1-mal bearbeitet
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: So 31.08.03 17:02 
wo soll die Resource sein? Du sucht via HInstance, also nur in der selbigen Exe-Datei.
grez
msch

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
Alibi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 458

Win2K SP3
Delphi 6 Ent
BeitragVerfasst: So 31.08.03 17:03 
FindResource wird in der Exe aufgerufen, in die auch die Resource reingeschrieben wurdem, hab das letzte Posting angepasst.
Alibi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 458

Win2K SP3
Delphi 6 Ent
BeitragVerfasst: So 31.08.03 17:33 
Ich hab jetzt bei BeginUpdateResource den 2. Parameter auf false gesetzt, damit die vorhandenen Resourcen nicht gelöscht werden, das wars aber nicht. ;)

Der Fehler kommt:
1814L ERROR_RESOURCE_NAME_NOT_FOUND
Ich war mit der Sprache in der Zeile verrutscht. ;)
Aber: Die Resourcennamen stimmen 100%, warum will der nicht?
Alibi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 458

Win2K SP3
Delphi 6 Ent
BeitragVerfasst: So 31.08.03 20:19 
Hab jetzt einfach Zahlen (MakeIntResource) genommen statt Namen für die Resource.

Nun will ich einfach den Inhalt der Resource in ein String kopieren, das ganze fliegt mir aber bei CopyMemory um die Ohren. Alle Handles und Pointer sind soweit richtig glaub ich, sind jedenfalls nicht 0 oder nil:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
  ResH := FindResource(hInstance, MakeIntResource(1000), RT_RCDATA);
  if ResH <> 0 then writeln('wow'else writeln(GetLastError);


  BFProgramRes := LoadResource(hInstance, ResH);
  ResSize := SizeofResource(hInstance, ResH);

  MemP := LockResource(BFProgramRes);
  SetLength(BFProgram,ResSize);
  CopyMemory(@BFProgram,MemP,ResSize);


// Erledigt.
Move(MemP, BFProgram, ResSize);
statt CopyMemory geht.