Tem como guardar em uma dll valores contador?

14/12/2005

0

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

Saudações/Hélio


Helio Nascimento

Helio Nascimento

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

14/12/2005

Helio Nascimento

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

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar