Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-03-2008
jw4v32 jw4v32 is offline
Registrado
 
Registrado: feb 2008
Posts: 8
Poder: 0
jw4v32 Va por buen camino
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?

3- GetMem(WideServerFile, (Length(ServerFile) + 1) * 2);
la memoria que reserva para WideServerFile es = a (longitud + 1) * 2 vaya formula!! 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, este no hace falta explicarlo.

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

Grax y Chau-


Responder Con Cita
  #2  
Antiguo 04-03-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Cita:
Empezado por jw4v32 Ver Mensaje
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 Ver Mensaje
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 Ver Mensaje
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?

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 Ver Mensaje
Cita:
Empezado por jw4v32 Ver Mensaje
3- GetMem(WideServerFile, (Length(ServerFile) + 1) * 2);
la memoria que reserva para WideServerFile es = a (longitud + 1) * 2 vaya formula!! 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 Ver Mensaje
4- Veo un Bug ahi en vez de liberar los recursos con finally, solo los libera si ocurre algun error, con except, que tonto, este no hace falta explicarlo.
que?

Última edición por cHackAll fecha: 04-03-2008 a las 20:29:25.
Responder Con Cita
  #3  
Antiguo 05-03-2008
jw4v32 jw4v32 is offline
Registrado
 
Registrado: feb 2008
Posts: 8
Poder: 0
jw4v32 Va por buen camino
Cita:
Empezado por cHackAll Ver Mensaje
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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
funcion para listar procesos, como javier20 API de Windows 1 08-02-2008 08:31:25
Cómo hacer para que muchos checkbox usen la misma función? Shikanda Varios 7 12-09-2007 17:27:48
Necesito crear un permiso para escribir pero no para leer federiconqn21 Conexión con bases de datos 5 07-07-2006 19:13:47
Como Utilizar La Funcion Desc Para Hacerla Parte De Un Query JOTAAB Oracle 2 06-01-2006 18:41:25
Recursos para D7 hgiacobone Varios 1 21-07-2003 12:16:13


La franja horaria es GMT +2. Ahora son las 12:04:41.


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
Copyright 1996-2007 Club Delphi