Fórum Tem como exportar uma conexão de uma DLL? #294802
08/09/2005
0
[b:900cd1c197]É possível eu criar uma DLL, com os meios de conexão, somente conexão (nada de Query e tals, somente SocketConnection) e depois eu exportar essa conexão? [/b:900cd1c197]
Tipo, não tem o Exports lá da DLL? então eu exportando essa conexão, meus aplicativos poderia ´ve-la´ sem problemas..
isso é posível?
Desde já agradeço
Titanius
Curtir tópico
+ 0Posts
08/09/2005
Carlosfim
Eu resolveria o problema da seguinte forma: Criaria uma função na DLL que, ao ser chamada, retornaria a instância do componente que vc precisa. Ficaria mais ou menos assim:
function GetConnection (Parâmetros, se necessário): TSocketConnection;
Depois declararia esta função na seção Exports da DLL. Daí, ao chamar esta função de dentro de seu exe ela retornaria a conexão que vc precisa.
Agora, se existe uma forma de declarar Objetos diretamente na seção Exports de uma DLL, isto eu não sei (Mas acredito que não exista).
Obs: Lembre-se que se vc tiver funções que retornem dados que não sejam de tipos nativos (como a função acima) vc precisa incluir a Uses ShareMem na sua DLL e em todos os programas onde vc for utilizá-la.
Espero ter ajudado.
Gostei + 0
08/09/2005
Titanius
Então há a possibilidade, de eu fazer uma conexão na DLL, e usar essa conexao nos meus aplicativops, blz... mas aih, no caso, como eu pegaria essa conexao no lado do aplicativo? pois certamente ela nao ira aparecer no combobox de coenxoes do meu ConnectionBroker :D
[]s
Gostei + 0
09/09/2005
Carlosfim
function GetConnection (Parâmetros, se necessário): TSocketConnection; stdcall; External MyDll.Dll; ... var Conexao: TSocketConnection; Broker: TConnectionBroker; begin Conexao := GetConexao(...); ... Broker.Connection := Conexao; ... end;
Se você tiver um ConnectionBroker em um formulário não irá precisar declarar uma variável do tipo TConnectionBroker, como listado acima. Basta recuperar a conexão (da DLL) e setar a propriedade Connection do ConnectionBroker.
Realmente ela não aparecerá no Combo, tem que ser feito na mão mesmo.
Até +
Gostei + 0
09/09/2005
Titanius
Voce me deu uma esclarecida boa.. putz.. agora começo a imaginar meu sistema todo em módulos... :D
Só ultima perguntinha: Voce sabe se posso usar essa dll, em pacote .bpl?
[]s
Gostei + 0
09/09/2005
Carlosfim
Não sei nada sobre Pacotes. Até estive procurando material sobre o assunto, mas acabei abandonando. Uso somente Dlls para modularizar.
Gostei + 0
09/09/2005
Titanius
mas no seu caso, o seus modulos eh modulo completo, tipo, pra cadastro e movimentacao? Funciona sem problemas?
Gostei + 0
09/09/2005
Carlosfim
Mas já utilizo módulos para funções comuns entre os softwares. Por exemplo, tenho um módulo que controla o travamento do sistema quando o usuário não paga (trabalho com aluguel). Esse módulo troca informações com minha aplicação, exibe interfaces de usuário, se conecta no banco de dados..., em fim, faz tudo que tem direito, sem problemas.
A única coisa que não gostei é que ainda não descobri uma maneira de abrir um formulário contido em uma DLL como filho do MDIForm da minha aplicação. E isso pra mim é importante, pq todos os meus programas utilizam MDI.
Gostei + 0
09/09/2005
Titanius
Gostei + 0
09/09/2005
Martins
Valew :)
Gostei + 0
09/09/2005
Titanius
Gostei + 0
31/01/2007
Mmoreira
Voce conseguiu fazer a exportação da conexão conforme voce perguntou no inicio do seu post?
Eu estive pensando em fazer o mesmo mas ao invez de exportar o SocketConnection eu ja ia logo exportar o SharedConnection.
Se voce tiver conseguido algo da uma luz ai ... pois meu medo maior é de fazer funcionar e depois que tudo tiver pronto começar a dar problemas.
valew
Gostei + 0
01/02/2007
Thiago Vidal
Se vc exportar a conexão dessa forma, vc precisará usar o ShareMem e o sistema ficará muito lento. para evitar isso, vc pode passar simplesmente o ponteiro para a conexao, e fazer um TypeCast... e MUITO IMPORTANTE, a conexão deve ser destruída no mesmo MM que a criou, ou seja, na DLL. Se vc nào fizer isso, depois de um tempo funcionando aparentemente normal o sistema começa a dar Access Violation na hora que fecha, depois de tudo, e vc nao consegue descobrir o motivo.
Eu também prefiro carregar as DLLs dinamicamente, entao, vou dar algumas funções que eu uso, coloquei as coisas aqui no DataModule, mas podem ver que isso tudo já tem cara para criar uma classe que controle cada modulo do sistema, e uma classe derivada de TObjectList para gerenciar todos de uma vez:
Interface do DataModule:
uses
Windows, SysUtils, Classes;
type
TDataModule1 = class(TDataModule)
procedure DataModuleCreate(Sender: TObject);
procedure DataModuleDestroy(Sender: TObject);
private
{ Private declarations }
DLL: THandle;
function GetObject(Nome: string): Pointer;
procedure DestroyObject(var Value);
public
{ Public declarations }
end;
No implementation:
procedure TDataModule1.DataModuleCreate(Sender: TObject); begin if FileExists(´MyDll.dll´) then DLL := LoadLibrary(´MyDll.dll´) else raise Exception.Create(´DLL nao encontrada´); end; procedure TDataModule1.DataModuleDestroy(Sender: TObject); begin if (DLL <> 0) then FreeLibrary(DLL); end; procedure TDataModule1.DestroyObject(var Value); var P: procedure(var Value); stdcall; begin @P := GetProcAddress(DLL, ´Destroy´); P(Value); end; function TDataModule1.GetObject(Nome: string): Pointer; var P: function: Pointer; stdcall; begin @P := GetProcAddress(DLL, PChar(Nome)); Result := P; end;
e na DLL:
library Project3;
uses
SysUtils,
Classes;
{$R *.res}
function Teste: Pointer; stdcall;
begin
Result := TObject.Create;
end;
procedure Destroy(var Value); stdcall;
begin
FreeAndNil(Value);
end;
exports
Teste,
Destroy;
begin
end.
lembrando que voce pode ter varias funcoes que retornam varios objetos, com apenas 1 para destrui-los, e para usar, basta passar o nome da funcao, por exemplo, para retornar o TObject da funcao Teste:
procedure TDataModule1.Teste; var Obj: TObject; begin Obj := TObject(GetObject(´Teste´)); try // Utilize o objeto aqui finally DestroyObject(Obj); end; end;
daqui a pouco mando código para utilizar forms MDI nas DLLs
Gostei + 0
01/02/2007
Mmoreira
Antes de tudo quero agradecer pela atenção!
Deu para entender seu codigo ai com uso de DLL vou até fazer um pequeno demo aqui para aplicar a sua técnica ... mas nestes dias estive procurando pelo assunto e cheguei a conclusao que trabalhar com Packages seria melhor por varios motivos.
Voce disse que tem boa experiencia em trabalhar desta maneria e inclusive com packages ... minha grande duvida hoje é saber se é possivel e como fazer para que um package se comunique com outro. Vou te dar um exemplo:
Tenho uma package: PacotePedido (Onde eu vou ter um cadastro de pedidos := Cabeçalho e itens do pedido) até aqui blz.
O problema: Para que eu monte o cabeçalho do Pedido eu preciso informar para qual cliente eu vou fazer o pedido .. entao eu tenho um outro package: PacoteCliente (onde eu tenho uma tela para localizar o cliente que eu quero e jogar no pedido) Entao o PacotePedido teria que chamar o PacoteCliente ... estando la eu ia procurar meu cliente e depois ia ´enviar´ este cliente selecionado para o PacotePedido.
É possivel fazer isso ??? Como ????
Espero que tenho conseguido passar minha duvida ... caso nao é só falar que tento explicar melhor.
Aguardando!!!
Gostei + 0
01/02/2007
Thiago Vidal
Como modularizar sua aplicação em pacotes:
1- Crie o pacote:
Em File/New, selecione Package, isso irá criar um pacote vazio. Em project options (Ctrl+Shift+F11), na guia defina um nome para o pacote, e marque-o com ´Runtime only´, pois este pacote nào será adicionado à IDE do Delphi.
2- Crie novos forms, ou adicione forms já existentes
(não esqueça de removê-los do projeto da aplicação principal depois)
3- Salve tudo, compile, o Delphi provavelmente irá exibir um aviso dizendo que alguns pacotes precisam ser adicionados, apenas dê OK.
4- Crie uma nova aplicação (VCL Forms) ou abra a sua já existente.
6- Para utilizar um form que está no pacote, apenas adicione a Unit em que ele se encontra à sua cláusula Uses..
7- Voce verá que apesar deste form nao ester no seu projeto, se o pacote estiver na mesma pasta, ele vai compilar, pois irá encontrar a DCU e incluí-la no objeto final... DETALHE: Até aqui, você não utiliza o pacote... a DCU do form foi embutida dentro do executável, como se fizesse parte dele, e aqui vem a diferença:
8- No menu ´Component´ selecione ´Install packages´, e na seção ´Build with runtime packages´ ative a CheckBox, que habilitará um Edit logo abaixo, com uma lista de pacotes.
No caso, o objetivo é continuar embutindo TODOS os componentes da VCL no executavel, e deixar separado APENAS o pacote que nós acabamos de criar, portanto, limpe o EDIT, e escreva apenas o nome do seu pacote, SEM o BPL.
9- Pronto, ao compilar denovo, mesmo com a DCU presente, o código do seu form não será embutido no executável, ao executar o programa, ele irá carregar o seu pacote bpl e executá-lo de lá, e você pode comprovar isso, fazendo alterações neste form, e recompilar o seu pacote SEM ALTERAR O PROGRAMA PRINCIPAL, e verá que as alterações estão lá presentes.
Obs: Recomendo que o pacote e o form principal estejam na mesma pasta, ou pelo menos tenham o mesmo DCU output path, para evitar problemas.
Obs 2: Obviamente, você nào poderá ter units com o mesmo nome no projeto principal e no pacote...
Obs 3: Para fazer um pacote se comunicar com outro, basta ir em ´Install Packages´ e habilitar a opção ´Build with Runtime Packages´ onde cada pacote terá o nome do outro digitado no Edit abaixo, e o Executável terá o nome dos 2 pacotes, separados por ponto-e-vírgula.
Bom, acho que é só, bem simples, se alguém se interessar eu fiz um projetinho de exemplo com forms MDI no pacote, basta me enviar um email para thixp.net@gmail.com que eu mando o exemplo.
Boa sorte!
Gostei + 0
01/02/2007
Mmoreira
Ja vou logo mandando uma duvida!
Vamos supor que eu tenha o seguinte Package: PacoteCliente e o mesmo esta fazendo uma conexao com um DataModule que esta em um package: PacoteConexao .. até aqui blz
Dai eu precisei adicionar ao meu DataModule um novo ClientDataSet para um novo cadastro em um Pacote qualquer que nao seja o de cadastro de cliente ... Dai eu aciciono o meu ClientDataSet no meu PacoteConexao, compilo o mesmo ... e blz ...
minha duvida é se eu alterando o PacoteConexao vou ter que recompilar todos os pacotes que fazer referencia a ele ???
Deu para pegar minha duvida?
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)