Tem como guardar em uma dll valores contador?
14/12/2005
0
Se tem como Fazer?
Saudações/Hélio
Helio Nascimento
Posts
14/12/2005
Adriano Santos
Eu prefiro trabalhar com arquivos .INI ou no Registry do Windows. Se precisar de uma ajuda neste caso pode contar.
14/12/2005
Helio Nascimento
Aceito sua sugestão. Voce pode me ajudar?
Sds/Hélio
14/12/2005
Vinicius2k
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+
14/12/2005
Adriano Santos
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;
14/12/2005
Adriano Santos
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;
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.
14/12/2005
Adriano Santos
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;
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.
14/12/2005
Adriano Santos
Clique aqui para fazer login e interagir na Comunidade :)