Ajuda com chamada de DLL

17/02/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
TabNcr = 22, 29, 535, 477, C, 110, 145, 623, 593, C
TabPar = 22, 29, 535, 477, C



TabPar.bas
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
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 ??????????


Fabiano Góes

Respostas

17/02/2006

Rafael Gomes

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


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´;



Responder Citar

17/02/2006

Rafael Gomes

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



Responder Citar

17/02/2006

Fabiano Góes

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.


Responder Citar

17/02/2006

Massuda

Tem cara de ser algo assim (nem sei se compila)...
type
  Reg_Tabela = packed record
    Tab_Arquivo: array[0..19&93; 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;
}



Responder Citar

17/02/2006

Fabiano Góes

Massuda funcionou cara, valeu mesmo !!!!

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

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 !!!!!


Responder Citar

17/02/2006

Rafael Gomes

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


Responder Citar

17/02/2006

Fabiano Góes

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

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

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


já tentei :

FreeAndNil(Tabela);


mais não deu certo.


Responder Citar

17/02/2006

Massuda

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

Sinceramente fiquei surpreso disso funcionar, porque não tenho certeza se...
Type Reg_Tabela 
    Tab_Arquivo         As String * 20 
...
...equivale a...
type
  Reg_Tabela = packed record 
    Tab_Arquivo: array[0..19&93; of Char; 
...
...se você puder, verifique com alguem que mexe com VB se ´As String * 20´ significa ´uma string de 20 caracteres´.


Responder Citar

17/02/2006

Fabiano Góes

É 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.

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



Responder Citar

17/02/2006

Massuda

Pode ser qualquer coisa.

A instrução no ´0x61046d46´
Tente determinar onde o erro está ocorrendo. Para isso:[list:3258fdd451][*:3258fdd451]marque as opções de debug em [b:3258fdd451]Project|Options|Compiler|Debugging[/b:3258fdd451][*:3258fdd451]dê um build (menu [b:3258fdd451]Project|Build[/b:3258fdd451]) no seu programa[*:3258fdd451]inicie a execução do seu programa[*:3258fdd451]volte no Delphi[*:3258fdd451]no menu [b:3258fdd451]Search|Find Error[/b:3258fdd451], 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.


Responder Citar