Tem como guardar em uma dll valores contador?

14/12/2005

1

Caros colegas. Gostaria de ´guardar´ em uma DLL valores de Contadores de acesso. Tem como ?
Se tem como Fazer?

Saudações/Hélio


Responder

Posts

14/12/2005

Edilcimar

crei que na dll não, mas no registro do windows sim


Responder

14/12/2005

Adriano Santos

Na dll não é possível, pois não permite escrita.
Eu prefiro trabalhar com arquivos .INI ou no Registry do Windows. Se precisar de uma ajuda neste caso pode contar.


Responder
Caro Adriano

Aceito sua sugestão. Voce pode me ajudar?

Sds/Hélio


Responder

14/12/2005

Vinicius2k

Colegas,

Concordo que é muito mais simples utilizar um .INI ou o Registry, porém devo discordar sobre não ser possível gravar em DLLs e EXEs.

O próprio Windows fornece o suporte para isto através das funções [b:3d51a0aaed]BeginUpdateResouce[/b:3d51a0aaed], [b:3d51a0aaed]UpdateResource[/b:3d51a0aaed] e [b:3d51a0aaed]EndUpdateResource[/b:3d51a0aaed]. A única restrição para gravação é que o arquivo não pode estar em uso, então, isto impede um executável de gravar em sí próprio.

Estas fuções da API permitem manipulação de recursos como ´ICON´, ´BITMAP´ e ´RCDATA´. Para armazenar um texto, RCDATA pode ser utilizado.

Em Windows 9x/ME estas funções não trabalham corretamente, mas existem clones da API feitas pela MadShi - www.madshi.net - (pacote MadCollection) que trabalham corretamente em todas as plataformas. As funções implementadas pela MadShi tem quase os mesmo nomes, porém terminam com ´W´ (Ex: BeginUpdateResouce[b:3d51a0aaed]W[/b:3d51a0aaed])

Abaixo um exemplo:
procedure GravarRecurso; 
var 
  hDLLRecurso: DWord; 
  Recurso: String; 
begin 
  Recurso:= ´Texto gravado na DLL´; 
  hDLLRecurso:= BeginUpdateResource(´NOME_DA_DLL.DLL´, False); 
  if hDLLRecurso <> 0 then 
  try 
    UpdateResource(hDLLRecurso, PWideChar(RT_RCDATA), ´NOME_DO_RECURSO´, 0, Pointer(Recurso), Length(Recurso)); 
  finally 
    EndUpdateResource(hDLLRecurso, False); 
  end; 
end;

procedure LerRecurso; 
var 
  ResData: HGLOBAL; 
  ResInfo: HRSRC; 
  Recurso: String; 
  hDLLRecurso: THandle; 
begin 
  hDLLRecurso:= LoadLibrary(´NOME_DA_DLL.DLL´); 
  try 
    ResInfo:= FindResource(hDLLRecurso, ´NOME_DO_RECURSO´, RT_RCDATA); 
    if ResInfo <> 0 then 
    begin 
      ResData:= LoadResource(hDLLRecurso, ResInfo); 
      if ResData <> 0 then 
      try 
        Recurso:= PChar(LockResource(ResData)); 
        UnlockResource(ResData); 
      finally 
        FreeResource(ResData); 
      end;
    end; 
  finally 
    FreeLibrary(hDLLRecurso); 
  end; 
end;


T+


Responder

14/12/2005

Adriano Santos

[quote:f39f451165=´Helio Nascimento´]Caro Adriano

Aceito sua sugestão. Voce pode me ajudar?

Sds/Hélio[/quote:f39f451165]

Pois não:

procedure TForm1.Button1Click(Sender: TObject);
var
  Registro : TIniFile;
begin
  Registro := TIniFile.Create(ExtractFilePath(Application.ExeName) + ´CONFIG.INI´);
  Registro.WriteInteger(´SECAO´,´CONTADOR´, 1);
  Registro.Free;
end;



Faz a leitura
procedure TForm1.Button2Click(Sender: TObject);
var
  Registro : TIniFile;
  Valor    : Integer;
begin
  Registro := TIniFile.Create(ExtractFilePath(Application.ExeName) + ´CONFIG.INI´);
  Valor := Registro.ReadInteger(´SECAO´,´CONTADOR´, Valor);
  Edit1.Text := IntToStr(Valor);
  Registro.Free;
end;



Responder

14/12/2005

Adriano Santos

Colegas, Concordo que é muito mais simples utilizar um .INI ou o Registry, porém devo discordar sobre não ser possível gravar em DLLs e EXEs. O próprio Windows fornece o suporte para isto através das funções [b:5f091dca26]BeginUpdateResouce[/b:5f091dca26], [b:5f091dca26]UpdateResource[/b:5f091dca26] e [b:5f091dca26]EndUpdateResource[/b:5f091dca26]. A única restrição para gravação é que o arquivo não pode estar em uso, então, isto impede um executável de gravar em sí próprio. Estas fuções da API permitem manipulação de recursos como ´ICON´, ´BITMAP´ e ´RCDATA´. Para armazenar um texto, RCDATA pode ser utilizado. Em Windows 9x/ME estas funções não trabalham corretamente, mas existem clones da API feitas pela MadShi - www.madshi.net - (pacote MadCollection) que trabalham corretamente em todas as plataformas. As funções implementadas pela MadShi tem quase os mesmo nomes, porém terminam com ´W´ (Ex: BeginUpdateResouce[b:5f091dca26]W[/b:5f091dca26]) Abaixo um exemplo:
procedure GravarRecurso; 
var 
  hDLLRecurso: DWord; 
  Recurso: String; 
begin 
  Recurso:= ´Texto gravado na DLL´; 
  hDLLRecurso:= BeginUpdateResource(´NOME_DA_DLL.DLL´, False); 
  if hDLLRecurso <> 0 then 
  try 
    UpdateResource(hDLLRecurso, PWideChar(RT_RCDATA), ´NOME_DO_RECURSO´, 0, Pointer(Recurso), Length(Recurso)); 
  finally 
    EndUpdateResource(hDLLRecurso, False); 
  end; 
end;

procedure LerRecurso; 
var 
  ResData: HGLOBAL; 
  ResInfo: HRSRC; 
  Recurso: String; 
  hDLLRecurso: THandle; 
begin 
  hDLLRecurso:= LoadLibrary(´NOME_DA_DLL.DLL´); 
  try 
    ResInfo:= FindResource(hDLLRecurso, ´NOME_DO_RECURSO´, RT_RCDATA); 
    if ResInfo <> 0 then 
    begin 
      ResData:= LoadResource(hDLLRecurso, ResInfo); 
      if ResData <> 0 then 
      try 
        Recurso:= PChar(LockResource(ResData)); 
        UnlockResource(ResData); 
      finally 
        FreeResource(ResData); 
      end;
    end; 
  finally 
    FreeLibrary(hDLLRecurso); 
  end; 
end;
T+




Muito loko o esquema hein Vinicius2K? Confesso que não havisa usado gravação e leitura de resources com DLLs somente com os arquivos .RES mesmo...gostei.

De qualquer forma joguei o exemplo como INI, concordo com você. Acho muito mais fácil a manipulação.


Responder

14/12/2005

Adriano Santos

Colegas, Concordo que é muito mais simples utilizar um .INI ou o Registry, porém devo discordar sobre não ser possível gravar em DLLs e EXEs. O próprio Windows fornece o suporte para isto através das funções [b:ef87907a83]BeginUpdateResouce[/b:ef87907a83], [b:ef87907a83]UpdateResource[/b:ef87907a83] e [b:ef87907a83]EndUpdateResource[/b:ef87907a83]. A única restrição para gravação é que o arquivo não pode estar em uso, então, isto impede um executável de gravar em sí próprio. Estas fuções da API permitem manipulação de recursos como ´ICON´, ´BITMAP´ e ´RCDATA´. Para armazenar um texto, RCDATA pode ser utilizado. Em Windows 9x/ME estas funções não trabalham corretamente, mas existem clones da API feitas pela MadShi - www.madshi.net - (pacote MadCollection) que trabalham corretamente em todas as plataformas. As funções implementadas pela MadShi tem quase os mesmo nomes, porém terminam com ´W´ (Ex: BeginUpdateResouce[b:ef87907a83]W[/b:ef87907a83]) Abaixo um exemplo:
procedure GravarRecurso; 
var 
  hDLLRecurso: DWord; 
  Recurso: String; 
begin 
  Recurso:= ´Texto gravado na DLL´; 
  hDLLRecurso:= BeginUpdateResource(´NOME_DA_DLL.DLL´, False); 
  if hDLLRecurso <> 0 then 
  try 
    UpdateResource(hDLLRecurso, PWideChar(RT_RCDATA), ´NOME_DO_RECURSO´, 0, Pointer(Recurso), Length(Recurso)); 
  finally 
    EndUpdateResource(hDLLRecurso, False); 
  end; 
end;

procedure LerRecurso; 
var 
  ResData: HGLOBAL; 
  ResInfo: HRSRC; 
  Recurso: String; 
  hDLLRecurso: THandle; 
begin 
  hDLLRecurso:= LoadLibrary(´NOME_DA_DLL.DLL´); 
  try 
    ResInfo:= FindResource(hDLLRecurso, ´NOME_DO_RECURSO´, RT_RCDATA); 
    if ResInfo <> 0 then 
    begin 
      ResData:= LoadResource(hDLLRecurso, ResInfo); 
      if ResData <> 0 then 
      try 
        Recurso:= PChar(LockResource(ResData)); 
        UnlockResource(ResData); 
      finally 
        FreeResource(ResData); 
      end;
    end; 
  finally 
    FreeLibrary(hDLLRecurso); 
  end; 
end;
T+




Muito loko o esquema hein Vinicius2K? Confesso que não havisa usado gravação e leitura de resources com DLLs somente com os arquivos .RES mesmo...gostei.

De qualquer forma joguei o exemplo como INI, concordo com você. Acho muito mais fácil a manipulação.


Responder

14/12/2005

Adriano Santos

Deslcupai galera, aconteceu algo aki e o post foi duas vezes.


Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira