Array
(
)

Ajuda com chamada de DLL

Fabiano Góes
   - 17 fev 2006

Galera, estou precisando muito de uma ajuda o mais rapido possivel.
Help...

bom tenho um exemplo de como chamar essa DLL em VB e precisava fazer o mesmo em Delphi, só q não entendo nada de VB.

abaixo os arquivos q foral usados para a chamada da DLL em VB

TabNcr.vbw
#Código


TabNcr = 22, 29, 535, 477, C, 110, 145, 623, 593, C
TabPar = 22, 29, 535, 477, C



TabPar.bas
#Código

Attribute VB_Name = "TabPar"
´Campos para Linkage de DLL COBOL
Type Reg_Tabela
Tab_Arquivo As String * 20
Tab_Registros As Integer
End Type

´Declaracão Da DLL COBOL
Declare Sub DLLNCR Lib "GERANCR.DLL" (Tabela As Reg_Tabela)


TabNcr.frm
#Código

Attribute VB_Name = "TabNcr"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Dim Tabela As Reg_Tabela

Private Sub BtnDLL_Click()
Tabela.Tab_Arquivo = ""
Tabela.Tab_Registros = 0
Call DLLNCR(Tabela)
TxtArquivo = Tabela.Tab_Arquivo
TxtRegistros = Tabela.Tab_Registros

End Sub



Como faço isso em Delphi ??????????


Rafael Gomes
   - 17 fev 2006

Para chamar uma dll basta declarar como abaixo ... e para usa-la, chame a funcao como voce sempre usou!!


#Código


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

function Double (N: Integer): Integer; stdcall; external ´NomedaDLL.DLL´;



Rafael Gomes
   - 17 fev 2006

#Código

[b][b]function FuncaodaDLL(Parametros): tipodaFuncao; stdcall; external ´GERANCR.DLL´;[/b][/b]



Fabiano Góes
   - 17 fev 2006

Rafael , muito obrigado pela atenção.

Porem eu ja usei funções de dll, o meu problema é q precisava entender como foi feito isso em VB (no codigo acima) para fazer o mesmo em Delphi.

A DLL é feita em cobol mais já esta compilada em 32 bits, não sei se isso ajuda

esse programinha em VB funciona perfeitamente com esse codigo acima.

Por favor galera, estou precisando muto dessa ajuda, kd os feras do forum sei q aqui é onde se encontra os melhores programadores Delphi, se eu não conseguir este informação aqui, não encontrarei em lugar nenhum.


Massuda
   - 17 fev 2006

Tem cara de ser algo assim (nem sei se compila)...#Código

type
Reg_Tabela = packed record
Tab_Arquivo: array[0..19] of Char;
Tab_Registros: Integer;
end;

procedure DLLNCR(var ATabela: Reg_Tabela); stdcall; external ´GERANCR.DLL´;

// o equivalente de BtnDLL_Click() seria algo assim...
{
procedure BtnDLL_Click;
begin
Tabela.Tab_Arquivo := "";
Tabela.Tab_Registros := 0 ;
DLLNCR(Tabela);
TxtArquivo := Tabela.Tab_Arquivo;
TxtRegistros := Tabela.Tab_Registros;
end;
}



Fabiano Góes
   - 17 fev 2006

Massuda funcionou cara, valeu mesmo !!!!

só ao sair do programa fica dando erro de referencia de memória:

#Código

A instrução no "0x61046d46" fez referência a memória no "0x00000000". A memória pode ser "read"



como corrigir isso ????

desded já agradeço muito !!!!!


Rafael Gomes
   - 17 fev 2006

perdao, nao havia ficado claro sua pergunta ...
abraços!!!


Fabiano Góes
   - 17 fev 2006

Rafael , beleza cara mesmo assim valeu pela usa atenção !

Mais e ai galera como evito esta mensagem de referencia de memoria


Citação:

A instrução no ´0x61046d46´ fez referência a memória no ´0x00000000´. A memória pode ser ´read´


já tentei :


Citação:
FreeAndNil(Tabela);


mais não deu certo.


Massuda
   - 17 fev 2006

O FreeAndNil não deve funcionar porque, imagino, Tabela é um record.

Sinceramente fiquei surpreso disso funcionar, porque não tenho certeza se...#Código

Type Reg_Tabela 
Tab_Arquivo As String * 20
...
...equivale a...#Código
type
Reg_Tabela = packed record
Tab_Arquivo: array[0..19] of Char;
...
...se você puder, verifique com alguem que mexe com VB se ´As String * 20´ significa ´uma string de 20 caracteres´.


Fabiano Góes
   - 17 fev 2006

É Massuda , funcionou mesmo cara,
e me ajudou muito ,
vc não tem idéia cara.

Valeu, Valeu, Valeu, Valeu, Valeu, Valeu, Valeu !!!!

Mais não querendo ser chato , porem já sendo(rsrssr)

Se alguem puder me ajudar com o Erro ao sair do programa eu agraço.

#Código

A instrução no "0x61046d46" fez referência a memória no "0x00000000". A memória pode ser "read" 



Massuda
   - 17 fev 2006

Pode ser qualquer coisa.


Citação:
A instrução no ´0x61046d46´
Tente determinar onde o erro está ocorrendo. Para isso:[list:3258fdd451][*:3258fdd451]marque as opções de debug em Project|Options|Compiler|Debugging[*:3258fdd451]dê um build (menu Project|Build) no seu programa[*:3258fdd451]inicie a execução do seu programa[*:3258fdd451]volte no Delphi[*:3258fdd451]no menu Search|Find Error, informe o endereço do erro (no caso, 61046d46)[/list:u:3258fdd451]Com um pouco de sorte, o Delphi irá mostrar a linha problemática.

Fora isso, não tenho nenhuma outra sugestão.