Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   funcion para escribir recursos (como?) (https://www.clubdelphi.com/foros/showthread.php?t=53914)

jw4v32 04-03-2008 19:03:11

funcion para escribir recursos (como?)
 
tengo el siguiente procedimiento que saque de un programa que lo que hace es escribir un buffer de datos como recursos en otro fichero, aver si alguien me aclara las dudas plz

el procedimiento es el siguiente:

Código Delphi [-]
procedure WriteResData(ServerFile: string; Buffer: Pointer; Size: Integer; ResourceName: string);
var
  ResourceHandle: THandle;
  WideServerFile: PWideChar;
  WideResourceName: PWideChar;
begin
  GetMem(WideServerFile, (Length(ServerFile) + 1) * 2);
  GetMem(WideResourceName, (Length(ResourceName) + 1) * 2);
  try
    StringToWideChar(ServerFile, WideServerFile, Length(ServerFile) * 2);
    StringToWideChar(ResourceName, WideResourceName, Length(ResourceName) * 2);
    ResourceHandle := BeginUpdateResourceW(WideServerFile, False);
    UpdateResourceW(ResourceHandle, MakeIntResourceW(10), WideResourceName, 0, Buffer, Size);
    EndUpdateResourceW(ResourceHandle, False);
  except
    FreeMem(WideServerFile);
    FreeMem(WideResourceName);
  end;
end;








1-por que se usan variables PWideChar, que son? y que diferencias hay entre los PChar por que no usar estos?

2- las funciones de las API que veo terminan en W, por lo que las Ansi ya quedaron obsoletas o que?

3- Como se sabe cuando usar cierta conbinacion de funciones API, ahi veo que usa 3:

1-BeginUpdateResourceW
2-UpdateResourceW
3-EndUpdateResourceW

a lo que me refiero es a por que las usa en ese orden?:confused:

3- GetMem(WideServerFile, (Length(ServerFile) + 1) * 2);
la memoria que reserva para WideServerFile es = a (longitud + 1) * 2 vaya formula!!:D a que se debe ese + 1 y *2 (ya se que es la multiplicacion es para reservar el doble de Chars pero por que?

4- Veo un Bug ahi en vez de liberar los recursos con finally, solo los libera si ocurre algun error, con except, que tonto:D, este no hace falta explicarlo.

Bueno si alguien tiene tiempo y puede espero me resuelva estas dudas.

Grax y Chau-



cHackAll 04-03-2008 20:25:14

Cita:

Empezado por jw4v32 (Mensaje 270590)
1-por que se usan variables PWideChar, que son? y que diferencias hay entre los PChar por que no usar estos?

La principal diferencia entre PWideChar y PChar es que PChar es ANSI, y PWideChar es UNICODE. en el primer caso cada byte de datos representa un caracter, en el segundo un caracter es almacenado en dos.

En este caso se usa PWideChar porque las funciones utilizadas, usan este tipo de datos.

Cita:

Empezado por jw4v32 (Mensaje 270590)
2- las funciones de las API que veo terminan en W, por lo que las Ansi ya quedaron obsoletas o que?

Talvez no haya soporte para dichas APIs en ANSI (me da flojera revisarlas), si terminan en W debes usar WideStringS como el PWideChar.

Cita:

Empezado por jw4v32 (Mensaje 270590)
3- Como se sabe cuando usar cierta conbinacion de funciones API, ahi veo que usa 3:

1-BeginUpdateResourceW
2-UpdateResourceW
3-EndUpdateResourceW

a lo que me refiero es a por que las usa en ese orden?:confused:


Yo te pregunto; como puedes copiar un archivo? primero debes encontrarlo, abrirlo, leerlo y, cerrarlo.. por que no en otro orden?

Cita:

Empezado por jw4v32 (Mensaje 270590)

Cita:

Empezado por jw4v32 (Mensaje 270590)
3- GetMem(WideServerFile, (Length(ServerFile) + 1) * 2);
la memoria que reserva para WideServerFile es = a (longitud + 1) * 2 vaya formula!!:D a que se debe ese + 1 y *2 (ya se que es la multiplicacion es para reservar el doble de Chars pero por que?



Cita:

Empezado por PChar
'cHackAll'#0 ocupa 9 caracteres, los 8 del nick y el caracter nulo de terminación.

Cita:

Empezado por PWideChar
'c'#0'H'#0'a'#0'c'#0'k'#0'A'#0'l'#0'l'#0#0#0 (8 + 1) * 2

Cita:

Empezado por jw4v32 (Mensaje 270590)
4- Veo un Bug ahi en vez de liberar los recursos con finally, solo los libera si ocurre algun error, con except, que tonto:D, este no hace falta explicarlo.

que?

jw4v32 05-03-2008 06:44:04

Cita:

Empezado por cHackAll (Mensaje 270609)
que?

me referia segun un libro que lei que con

try
//codigo
finally
//codigo
end;

en este caso ejecuta el codigo dentro del try ,si no se produce ningun error libera los recursos igualmentes, en cambio si se produce un error el finally asegura la liberacion de los recusos.


con:

try
//codigo
except
//codigo
end;

ejecuta el try si se produce un error salta directamente al codigo del except, en cambio si no se produce ningun error el codigo dentro del except no se ejecuta.

por lo tanto en el codigo que postee mas arriba, esos recursos solo los va a liberar si se produce un error.

y segun lei esta mal dejar recursos que no se necesitan abiertos en el sistema ya que consumen RAM


La franja horaria es GMT +2. Ahora son las 23:08:12.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi