Filizola MF-C
09/11/2009
0
Boa tarde Pessoal;
Preciso de uma ajuda de, como fazer uma dll ponte, para receber as informações da pcscale.dll
/----------------------------------------------------------------//
{ INICIO FUNCOES DA DLL PcScale }
//----------------------------------------------------------------//
{Declara a função ConfiguraBalanca existente na DLL "PcScale.dll"}
function ConfiguraBalanca(Balanca: Integer; Aplicativo: THandle): Boolean;
stdcall; external PcScale; {Declara a função InicializaLeitura existente na DLL "PcScale.dll"}
function InicializaLeitura(Balanca: Integer): Boolean;
stdcall; external PcScale; {Declara a função ObtemInformacao existente na DLL "PcScale.dll"}
function ObtemInformacao(Balanca: Integer; Campo: Integer): double;
stdcall; external PcScale; {Declara a função FinalizaLeitura existente na DLL "PcScale.dll"}
function FinalizaLeitura(Balanca: Integer) : Boolean;
stdcall; external PcScale; {Declara a função ExibeMsgErro existente na DLL "PcScale.dll"}
function EnviaPrecoCS(Balanca : integer; Preco : double) : Boolean;
stdcall; external PcScale; {Declara a função FinalizaLeitura existente na DLL "PcScale.dll"}
function ObtemParametrosBalanca(Balanca: Integer; Modelo: PInteger;
Porta: PInteger; BaudRate: PInteger
): Boolean
stdcall; external PcScale; {Declara a função ObtemNomeBalanca existente na DLL "PcScale.dll"}
Procedure ObtemNomeBalanca(Modelo: Integer; Ret: PChar);
stdcall; external PcScale; {Declara a função ExibeMsgErro existente na DLL "PcScale.dll"}
Procedure ExibeMsgErro(Aplicativo : THandle);
stdcall; external PcScale;
Conforme exemplo: Library CarregaDll; Uses SysUtils, Classes, Windows, Dialogs; {$R *.RES} Type TConsisteInscricaoEstadual = Function (Const Insc, UF: String): Integer; Stdcall; // iFuncId -> Código identificador da função // pParametro -> Parâmetros passados para a função // pBuffer -> Retorno da função // iBuffer -> Tamanho do buffer de retorno pré-alocado ( São alocados 20000 Bytes por padrão ) Procedure Funcao2; Begin MessageDlg('Funcao 1', mtinformation, [mbok], 0); End; Procedure ExecInClientDLL( iFuncId : integer; pParametro, pBuffer : pChar; iBuffer : integer ); StdCall; Var ConsisteInscricaoEstadual : TConsisteInscricaoEstadual; LibHandle: THandle; sRetorno: String; aParametro: Array[0..10] Of String; iParametros, iPos, iIndice: Integer; Begin Case iFuncId Of 1: Begin LibHandle := LoadLibrary (PChar (Trim ('DllInscE32.Dll'))); If LibHandle <= HINSTANCE_ERROR Then Raise Exception.Create ('Dll não carregada'); @ConsisteInscricaoEstadual := GetProcAddress (LibHandle, 'ConsisteInscricaoEstadual'); iParametros := 1; sRetorno := pParametro; While Pos(',', sRetorno) > 0 Do Begin sRetorno := Copy(sRetorno, Pos(',', sRetorno) + 1, Length(sRetorno)); Inc(iParametros, 1); End; sRetorno := pParametro; iIndice := 1; While iIndice <= iParametros Do Begin If Pos(',', sRetorno) > 0 Then iPos := Pos(',', sRetorno) - 1 Else iPos := Length(sRetorno); aParametro[iIndice - 1] := Copy(sRetorno, 1, iPos); sRetorno := PChar(Copy(sRetorno, Pos(',', sRetorno) + 1, Length(sRetorno))); Inc(iIndice, 1); End; sRetorno := IntToStr(ConsisteInscricaoEstadual(aParametro[0], aParametro[1])); StrPLCopy(pBuffer , sRetorno, iBuffer); End; 2: Funcao2() End; End; Exports ExecInClientDLL; // Essa será a única função lida pelo client do Protheus Begin End. Observação - As dll’s envolvidas ao processo devem estar na pasta onde o atalho do remote está sendo executado, Obrigado
{ INICIO FUNCOES DA DLL PcScale }
//----------------------------------------------------------------//
{Declara a função ConfiguraBalanca existente na DLL "PcScale.dll"}
function ConfiguraBalanca(Balanca: Integer; Aplicativo: THandle): Boolean;
stdcall; external PcScale; {Declara a função InicializaLeitura existente na DLL "PcScale.dll"}
function InicializaLeitura(Balanca: Integer): Boolean;
stdcall; external PcScale; {Declara a função ObtemInformacao existente na DLL "PcScale.dll"}
function ObtemInformacao(Balanca: Integer; Campo: Integer): double;
stdcall; external PcScale; {Declara a função FinalizaLeitura existente na DLL "PcScale.dll"}
function FinalizaLeitura(Balanca: Integer) : Boolean;
stdcall; external PcScale; {Declara a função ExibeMsgErro existente na DLL "PcScale.dll"}
function EnviaPrecoCS(Balanca : integer; Preco : double) : Boolean;
stdcall; external PcScale; {Declara a função FinalizaLeitura existente na DLL "PcScale.dll"}
function ObtemParametrosBalanca(Balanca: Integer; Modelo: PInteger;
Porta: PInteger; BaudRate: PInteger
): Boolean
stdcall; external PcScale; {Declara a função ObtemNomeBalanca existente na DLL "PcScale.dll"}
Procedure ObtemNomeBalanca(Modelo: Integer; Ret: PChar);
stdcall; external PcScale; {Declara a função ExibeMsgErro existente na DLL "PcScale.dll"}
Procedure ExibeMsgErro(Aplicativo : THandle);
stdcall; external PcScale;
Conforme exemplo: Library CarregaDll; Uses SysUtils, Classes, Windows, Dialogs; {$R *.RES} Type TConsisteInscricaoEstadual = Function (Const Insc, UF: String): Integer; Stdcall; // iFuncId -> Código identificador da função // pParametro -> Parâmetros passados para a função // pBuffer -> Retorno da função // iBuffer -> Tamanho do buffer de retorno pré-alocado ( São alocados 20000 Bytes por padrão ) Procedure Funcao2; Begin MessageDlg('Funcao 1', mtinformation, [mbok], 0); End; Procedure ExecInClientDLL( iFuncId : integer; pParametro, pBuffer : pChar; iBuffer : integer ); StdCall; Var ConsisteInscricaoEstadual : TConsisteInscricaoEstadual; LibHandle: THandle; sRetorno: String; aParametro: Array[0..10] Of String; iParametros, iPos, iIndice: Integer; Begin Case iFuncId Of 1: Begin LibHandle := LoadLibrary (PChar (Trim ('DllInscE32.Dll'))); If LibHandle <= HINSTANCE_ERROR Then Raise Exception.Create ('Dll não carregada'); @ConsisteInscricaoEstadual := GetProcAddress (LibHandle, 'ConsisteInscricaoEstadual'); iParametros := 1; sRetorno := pParametro; While Pos(',', sRetorno) > 0 Do Begin sRetorno := Copy(sRetorno, Pos(',', sRetorno) + 1, Length(sRetorno)); Inc(iParametros, 1); End; sRetorno := pParametro; iIndice := 1; While iIndice <= iParametros Do Begin If Pos(',', sRetorno) > 0 Then iPos := Pos(',', sRetorno) - 1 Else iPos := Length(sRetorno); aParametro[iIndice - 1] := Copy(sRetorno, 1, iPos); sRetorno := PChar(Copy(sRetorno, Pos(',', sRetorno) + 1, Length(sRetorno))); Inc(iIndice, 1); End; sRetorno := IntToStr(ConsisteInscricaoEstadual(aParametro[0], aParametro[1])); StrPLCopy(pBuffer , sRetorno, iBuffer); End; 2: Funcao2() End; End; Exports ExecInClientDLL; // Essa será a única função lida pelo client do Protheus Begin End. Observação - As dll’s envolvidas ao processo devem estar na pasta onde o atalho do remote está sendo executado, Obrigado
Carlos Silva
Curtir tópico
+ 0
Responder
Clique aqui para fazer login e interagir na Comunidade :)