Fórum Problema ao carregar dll em runtime #283988
07/06/2005
0
Dei uma procurada no histórico de mensagens mas não encontrei resposta ao meu problema.
Seguinte: construí uma dll para impressão de notas fiscais de nossos clientes, sendo que cada um tem a sua. Tentei carregar ela somente no momento em que será utilizada, mas não funciona.
Eu passo prá ela a Connection e as notas a serem impressas. Na dll tenho um dataModule que serve unica e exclusivamente pra criação das querys (tbém em run time). Mas na hora de criar as querys, ao passar a Connection para ela, dá pau de violação de acesso. Estou passando a Connection por referência para o DataModule, mas já tentei por valor e tbém não deu.
O mais estranho é que se eu carrego a dll ao abrir a aplicação não dá pau.
Alguém sabe me dizer como posso fazer?
Muito obrigado.
__________________
Marcelo Schmidt

Schmidt
Curtir tópico
+ 0Posts
07/06/2005
Carlosfim
Vc está usando a Unit ShareMem do Delphi?
Quando vc precisa passar parâmetros ou receber retornos de funções armazenadas em Dll que não sejam declarados com os tipos nativos do Windows vc precisa usar ShareMem tanto no Aplicativo quanto na Dll. Esta deve ser declarada na Unit do projeto, e deve ser a primeira.
Espero ter ajudado
Gostei + 0
08/06/2005
Schmidt
Obrigado pela dica, rapaz, mas ainda assim não funcionou. Testei em uma aplicação com um único form e botão que simplesmente chama a dll em questão com o ShareMem no topo dos uses do .dpr. Prá esse funcionou. Agora, pra aplicação onde ele é prá funcionar de verdade, não consigo de jeito nenhum... e é sempre no mesmo lugar: na hora de passar a TADOConnection prá TADOQuery.
Muito obrigado, Carlos, mas se não for pedir demais, tens mais alguma sugestão?
__________________
Marcelo Schmidt
Gostei + 0
08/06/2005
Carlosfim
Só vendo o código mesmo.
Gostei + 0
09/06/2005
Schmidt
Bem, vou tentar postar o código aqui.
Esse é o código da função que eu exporto da dll
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | procedure imprimir(var con: TADOConnection; inicio: integer; fim: integer = 0); safecall; export; var impressao: TImpressaoFMate; begin dtmDados:= TdtmDados.Create(Application); dtmDados.setConexao(con); impressao:= TImpressaoFMate.criar(); impressao.imprimir(inicio, fim); impressao.destruir(); dtmDados.Destroy; end; |
OK?, bom, o setConexao é um setter normal que recebe o parâmetro e o atribui a uma variável privada, com uma única diferença: o parãmetro é passado por referência.
No mais , tá tranquilo.
Vamos para a parte de criação da query:
1 2 3 4 5 6 | constructor TEnderecoMdl.criar(); begin inherited create(); Fqry:= TADOQuery.Create(dtmDados); Fqry.Connection:= dtmDados.getConexao; end; |
Esse é o construtor de uma classe da dll. Como se vê, eu crio a qry dinamicamente, o que acontece normalmente. Mas quando a terceira linha do construtor é executada, dá pau que nem adianta colocar aqui, pq não diz nada. diz só que houveram muitas exceções. Debugando a dll, descobri que parece que ela distorce o objeto TADOConnection, pq a descrição não tem nada a ver com isso.
Lembrando: eu coloquei a ShareMem nos dpr dos dois projetos, tanto na aplicação quanto na dll.
Qualquer coisa eu agradeço..
__________________
Marcelo Schmidt
Gostei + 0
09/06/2005
Massuda
Compile tanto seu programa como sua DLL usando packages (Project|Options|Packages|Build with runtime packages), incluindo apenas os packages do Delphi; por exemplo, se for Delphi 5, esses packages seriam Vcl50, Vclx50, Vcldb50, Vclbde50, vcldbx50.
A VCL utiliza algumas variáveis globais internas para controlar forms e datamodules. Quando você cria um programa + DLLs que não compartilham as mesmas variáveis globais costuma dar problema.
Gostei + 0
10/06/2005
Carlosfim
Já tive problemas de estouro de memória usando safecall e quando troquei para stdcall o problema foi resolvido, porém eu utilizava a dll em questão estaticamente.
Vale apena tentar!!!
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)