sábado, 19 de setembro de 2015

Wx - Trabalhando com DLL de Terceiros





Adriano - Wx - Trabalhando com DLL de Terceiros - Forum Windev










//OBS.:

//Inicialmente registre por dos comando: regsvr32.exe
//Nao sei se alguem precisa mais ai vai a solução:

//StringRetrieve(retornomemoria , srUNICODEAddress )

//alterei de

//srASCIIZAddress para srUNICODEAddress

//ficou assim:

retornomemoria is int = CallDLL32("spdNfeLib.dll","StatusDoServico",Caminhoini,1)

xmlretorno is string = StringRetrieve ( retornomemoria , srUNICODEAddress )

Info (xmlretorno)





//Sobre o calldll32 retorna somente inteiro ai para ler o retorno string precisei fazer dessa forma:

hInst is int = LoadDLL("nfe.dll")

//hInst = LoadDLL("spdNfeLib.dll")

IF hInst = 0 THEN

Error(ErrorInfo())

ELSE

nAddrASCIIZString is int = CallDLL32("nfe.dll", "VLK_ConsultaStatusWS", Caminhoini,1)
sStringContent is string = StringRetrieve ( nAddrASCIIZString , srASCIIZAddress )

Info(sStringContent)

//sRetorno is string = sString is string CallDLL32("nfe.dll","VLK_ConsultaStatusWS",caminhoini,1)
//CallDLL32("spdNfeLib.dll","StatusDoServico",caminhoini,1)

FreeDLL(hInst)

END

//O stringretrieve que converte de int para string



//Vejamos o seguinte exemplo:

//EM CLARION:

PUBLIC *CLASTRING FastQRCode(*CLASTRING,*CLASTRING)

//Obs.: é com ponteiro

//Não é uma simples string
//é um ponteiro de string
//com endereçamento de memoria

//Voce em que tomar cuidado para não mandar um caminhao entrar numa garagem de um fusca
//ai não da certo, a tipagem de campos algo bem sério para a questão da prototipação de Dlls de terceiros.
//em seu sistema, pois uma vez mal feito vai gerar excessoes, exceptions GPFs em seu sistema.
//A Dll deve ser encaixada corretamente em seu sistema
//A variavel do tipo VARIANT aceita qualquer coisa bem como a BUFFER na maioria dos casos



Publicado em setembro, 17 2015 - 5:16 PM
Principal noção:

A) Carrega uma Dll na memória com LoadDLL (Function)
http://help.windev.com/en-US/…
<Result> = LoadDLL(<DLL Name>)
Ex.:
hInst is int
hInst = LoadDLL("MyDLL.DLL")
IF hInst = 0 THEN
Error(ErrorInfo())
ELSE
Info("DLL loaded")
FreeDLL(hInst)
END



B) Executa um metodo interno de uma DLL com CallDLL32 (Function)
http://help.windev.com/en-US/…
<Result> = CallDLL32(<DLL Name>, <Function Number> [, <Parameter 1> [, <Parameter 2> [, ... ]]])
Ex.;
CallDLL32("USER32", "SendMessageA", hWnd, wMsg, lParam1, lParam2)



C) Libera uma DLL com FreeDLL (Function)
http://help.windev.com/en-US/…
Ex.:
hInst = LoadDLL("MyDLL.DLL")
IF hInst = 0 THEN
Error("Error during the unload operation")
ELSE
CallDLL32("MyDLL", "FunctionA", par1, par2)
CallDLL32("MyDLL", "FunctionB", par1)
FreeDLL(hInst)
END


Outros links:

Selecting_the_libraries
http://help.windev.com/en-US/…
http://help.windev.com/en-US/…
http://help.windev.com/en-US/…


Returns the list of libraries (".DLL" files) used by one of the applications currently run. This application can correspond to a WinDev application, a WinDev Mobile application or another application.
http://help.windev.com/en-US/…


The list of libraries (".DLL" files) used by the current WinDev or WinDev Mobile application or by the current WebDev site. Only the libraries loaded in memory are listed.
http://help.windev.com/en-US/…


API do Windows
http://help.windev.com/en-US/…
e
http://help.windev.com/en-US/…
Ex.:
API("USER32", "SendMessageA", hWnd, wMsg, lParam1, lParam2)
<Result> = API(<DLL Name> , <Function Name> [, <Parameter 1> [, <Parameter 2> [, ...]]])


Código 34 é um erro de DLL
http://help.windev.com/en-US/…
Unable to load the <DLL_NAME> DLL. ERR_NO_DLLEXE (34)
http://help.windev.com/en-US/…
The <DLL_NAME> DLL is not compatible with this version of WEBDEV. ERR_BAD_DLLEXE


Eu Tinha problema na linguagem(Clarion) em pegar o retorno de uma DLL desenvolvida em Delphi, que retornava o tipo de Variavél "PwideChar()"... Não conseguia pegar de jeito nenhum...

Já com a ferramenta Windev, utilizando os procedimentos acima meus problemas acabaram.. :) consegui pegar o retorno sem problemas.... Isso irá me ajudar muito no desenvolvimento ...

Para os que tiverem o mesmo problema que tive... vai uma dica ao tentar pegar o Retorno de uma DLL desenvolvida em Delphi cuja varaiável é do tipo PWideChar():

Utilizando a opção "srASCIIZAddress" não funcionou:

xmlretorno is string = StringRetrieve ( retornomemoria , srASCIIZAddress)


AI para funcionar precisei utilizar a opção: "srUNICODEAddress "
xmlretorno is string = StringRetrieve ( retornomemoria , srUNICODEAddress )


Nenhum comentário:

Postar um comentário

Teste

Teste
teste