Erro ao rodar DLL com Form e Memo
Olá pessoal, tudo bem?
Estou fazendo um editor bem simples, no Delphi 7, que será invocado por um programa escrito em Cobol. Para isso, criei uma DLL para tal função. O problema é que nos testes que estou fazendo, no próprio Delphi, ao chamar o Form que contém o editor aparece o seguinte erro:
Access violation at address 0036CD6E in module ´minhadll.dll´. Read of address 000002F8.
Abaixo inseri o trecho da função que existe dentro da dll.
function capxedit(s: String): String; stdcall; export;
var
TXT: TextFile;
RDR: String;
begin
AssignFile(TXT, s);
Reset(TXT);
FrmXEDITOR.MemoXEDITOR.Clear;
FrmXEDITOR.Show;
while not eof(TXT) do
begin
ReadLN(TXT, RDR);
FrmXEDITOR.MemoXEDITOR.Lines.Add(RDR);
end;
CloseFile(TXT);
end;
Exports
capxedit;
O erro dá no ponto da instrução:
FrmXEDITOR.MemoXEDITOR.Clear;
Declarei na Unit as cláusulas ShareMem, SysUtils e Classes, além da unit que está o form. Será que falta alguma cláusula na Unit para eu declarar?
Obrigado pelas dicas! :-)
Estou fazendo um editor bem simples, no Delphi 7, que será invocado por um programa escrito em Cobol. Para isso, criei uma DLL para tal função. O problema é que nos testes que estou fazendo, no próprio Delphi, ao chamar o Form que contém o editor aparece o seguinte erro:
Access violation at address 0036CD6E in module ´minhadll.dll´. Read of address 000002F8.
Abaixo inseri o trecho da função que existe dentro da dll.
function capxedit(s: String): String; stdcall; export;
var
TXT: TextFile;
RDR: String;
begin
AssignFile(TXT, s);
Reset(TXT);
FrmXEDITOR.MemoXEDITOR.Clear;
FrmXEDITOR.Show;
while not eof(TXT) do
begin
ReadLN(TXT, RDR);
FrmXEDITOR.MemoXEDITOR.Lines.Add(RDR);
end;
CloseFile(TXT);
end;
Exports
capxedit;
O erro dá no ponto da instrução:
FrmXEDITOR.MemoXEDITOR.Clear;
Declarei na Unit as cláusulas ShareMem, SysUtils e Classes, além da unit que está o form. Será que falta alguma cláusula na Unit para eu declarar?
Obrigado pelas dicas! :-)
Jorgeolimpia
Curtidas 0
Respostas
Biohazard
21/03/2005
Você está utilizando string como parâmetro, você tem que criar um tipo por exemplo:
type
tyString = string[255];
e na sua função declare assim:
function Exemplo(S: tyString) : tyString;
qualquer dúvida mande-me um email
type
tyString = string[255];
e na sua função declare assim:
function Exemplo(S: tyString) : tyString;
qualquer dúvida mande-me um email
GOSTEI 0
Kapak
21/03/2005
Se vc utiliza strings como parâmetros de funções em dlls, vc tem que declarar Sharemem no uses dos dois .dpr e não na unit.
GOSTEI 0
Jorgeolimpia
21/03/2005
Caro BioHazard, tudo bem?
A questão da string é que ela existe ali só para capturar o txt que o programa vai enviar, ou seja, lá no Cobol vou executar o comando
CALL$ minhadll.dll ´capxedit(C:\teste\relatorio.txt)´
O caminho que está dentro do capxedit é o que vai para a string, aí faço aquela leitura básica do arquivo texto. Acredito que seja alguma rotina do form pois se troco por um ShowMessage() por exemplo, as linhas são mostradas uma a uma.
Obrigado pela dica!
A questão da string é que ela existe ali só para capturar o txt que o programa vai enviar, ou seja, lá no Cobol vou executar o comando
CALL$ minhadll.dll ´capxedit(C:\teste\relatorio.txt)´
O caminho que está dentro do capxedit é o que vai para a string, aí faço aquela leitura básica do arquivo texto. Acredito que seja alguma rotina do form pois se troco por um ShowMessage() por exemplo, as linhas são mostradas uma a uma.
Obrigado pela dica!
GOSTEI 0