PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV 25 → Wx - Trabalhando com DLL de Terceiros
Wx - Trabalhando com DLL de Terceiros
Iniciado por adrianoboller, set., 17 2015 4:46 PM - 7 respostas
Membro registado
3.651 mensagems
Popularité : +175 (223 votes)
Publicado em setembro, 17 2015 - 4:46 PM
//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


--
Adriano Jose Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
______________________________________________
Membro registado
3.651 mensagems
Popularité : +175 (223 votes)
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

--
Adriano Jose Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
______________________________________________
Membro registado
3.651 mensagems
Popularité : +175 (223 votes)
Publicado em setembro, 17 2015 - 5:21 PM
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

--
Adriano Jose Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
______________________________________________
Membro registado
13 mensagems
Popularité : +9 (9 votes)
Publicado em setembro, 17 2015 - 5:33 PM
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 )


Funcionou perfeitamente!!!!!! :) :) Obrigado Adriano pela Força!!!
Membro registado
3.651 mensagems
Popularité : +175 (223 votes)
Publicado em setembro, 17 2015 - 5:55 PM
Resumo

Vou passar 10 itens sobre a Prototipação de DLL que todos devem ter em mente:

1 - Ter o manual da DLL, ter acesso ao site e ate mesmo o email de quem criou a DLL se possivel para tirar dúvidas, ela deve estar documentada

2 - Deve saber se a DLL possui algum bloqueio de uso tipo depois da data x nao gera retorno, deve testar, para nao ter sustos, a DLL dentro dela pode verificar a data do computador ou dispositivo e se for maior que um parametro que o programador colocou ela nao funciona mais, atrasando a data ou tendo o arquivo de licença de uso dela no diretorio que o desenvolvedor disse que deveria ter estar o arquivo. Apesar de ser uma DLL ela tem uma vida própria comanos que estao rodando dentro dela que nao sao abertos pois estao em codigo de maquina, não tem como saber o que ocorre, tem que confiar e rezar.

3 - Saber se a DLL necessita de uma porta de comunicação x serial, paralela, socket ou acesso a internet, dai é necessário verificar as especificações e liberar o firewall e a porta e o link. A DLL pode ter o uso de um webservice ou acesso a uma base de dados externa, por isso é recomendavel conhecer o seu funcionamento por completo para não ter imprevistos. As vezes a DLL possui até Hardlock de uso, um pendrive que se não estiver conectado ela não funciona, pois a licença é paga e isso é a garantia de só poder usar se tiver tal equipamento, isso tudo tem que ser verificado antes de usar uma DLL de TERCEIROS!

4 - Verificar se a DLL é 32 ou 64 bits, verificar se onde ela vai rodar é um ambiente operacional (S.O.) compativel também. Vai gerar um GPF caso isso esteja diferente das especificações da construção da DLL para o sistema que for executar e consumir as tarefas dela.

5 - Verificar os parametros se esta passando a tipagem certa dos campos, voce deve usar os tipos corretos na prototipação, verificar se é um *cstring ou um cstring (ponteiro de memória do tipo cstring com terminador de linha ou apenas um cstring com terminador de linha). Voce deve compreender exatamente qual o dado, tipo, tamanho que voce vai passar nao vai ultrapassar o que o metodo interno da DLL espera pois isso vai gerar um GPF em sua aplicação. Tipo de dado é se é inteiro, string, data, hora, blob, array, struct, queue,... não tem como colocar uma carreta numa pequena garagem de fusca... lembre-se disso... voce deve prototipar, ou seja falar da mesma forma que ela espera que seja feito, qualquer dado que ultrapasse a entrada dos valores dos parametros dos métodos, vai gerar um OVERFLOW e um GPF na aplicação executora.

6 - Verificar se os tipos de dados são UNICODE, ANSI, UTF-8.... Voce deve usar o mesmo tipo esperado pela DLL deve usar o tipo correto de endcode. Isso é muito importante, usar o Tipo de dado correto pois pode gerar GPF.

7 - Toda DLL recebe parametros que por sua vez entram nos metodos internos que por sua vez gera um processamento que por fim gera um resultado final de retorno, o que ocorre dentro da DLL é código de baixo nível, codigo de máquina, não tem como saber ou seja DECOMPILAR. Ela consegue ter acesso a todo o seu sistema operacional, inclusive unidades de disco, memória e recursos do seu sistmea operacional, ela é uma DLL = Dinamic Link Library = Biblioteca de Link Dinâmico... Deve ser carregada, usada e em seguida liberada.

8 - Deve registrar a DLL no Windows com o comando regsvr32.exe e o nome da dll deve retornar que a dll foi registrada com sucesso pelo Ms-Dos, caso não esteja conseguindo é recomendavel limpar o registro com um utilitário tipo Regclean ou CCleanner ou REGISTER MECHANIC. Caso não adiante tente em outra máquina e se der certo, recomendo reinstalar o windows na última hipótese.

9 - Algumas DLL possuem arquivos .ini que tem os parametros, licença de uso que devem ser observados para o seu funcionamento normal. Caso não esteja no mesmo diretório a DLL não roda os processos por nao ter os parametros de configuração.

10 - Estar com a data do sistema operacional do computador ou dispositivo sincronizada corretamente, pois muitas DLL e aplicações inteiras tem comportamentos estranhos caso a data e hora estejam muito erradas. Pode fazer até mesmo que a DLL por ser de terceiro e tenha uma licença não execute nada pois esta fora da faixa, intervalo de datas e horas que ela pode operar, isso deve ser testado para evitar futuros imprevistos.

Julgo que se observar todos esses itens a DLL rode 100%

Caso alguem tenha mais algum detalhe que eu possa ter esquecido complemente esse post.

[ ]´s

--
Adriano Jose Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
______________________________________________
Membro registado
3.651 mensagems
Popularité : +175 (223 votes)
Publicado em setembro, 17 2015 - 6:27 PM
Prezado Danilo,

Eu que agradeço, pela sua paciencia comigo e com os meus exemplos que as vezes são meio toscos, e fico super feliz que tenha conseguido fazer. É uma alegria de dever cumprido!!! isso não tem preço!!!

A ferramenta Clarion eu trabalhei uns 15 anos, muito boa, mas parou no tempo e tomou rumos diferentes da ideia principal, perdeu foco.

Conto com a ajuda sua e de todos para que não ocorra isso com a PcSoft, que mantenha um alto nível de qualidade no que usamos com nenhum GPF atrapalhando o nosso trabalho, seja robusta e eficaz. Conto com a colaboração de exemplos e pedidos de melhoria no post que abri aqui no forum para a melhoria continua da ferramenta.

O link é esse:
http://forum.pcsoft.fr/fr-FR/pcsoft.br.windev/431-sugestoes-melhorias-para-ferramentas-pcsoft/read.awp…

OBS.: Lembro de um detalhe, os programadores da Pcsoft precisam que a feramenta seja vendida e atualizada para as novas versões, eles nos entregarem cada dia novidades e estamos com uma ferramenta completa para os 3 ambientes. Sem a venda e sem o upgrade fica complicado da pcsoft manter a sua estrutura. Lembre-se disso pessoal...


Adendo:

Vou dar um exemplo bem pratico do barato sai caro, este esses dias em minha empresa um empresario que tem softhouse e usa ferramentas free JAVA, se assustou que aqui eu e mais um colaborador, fazemos tudo, em contrapartida ele tem 35 programadores e o processo é lento de desenvolvimento, fora a quantidade de erros e correções.

A licença pode ser adquirida da Pcsoft a vista pelo mesmo preço do site mais taxas administrativas e processos de importação e despacho via sedex ou em até 12x na maioria dos cartões de crédito e com o AURA em ate 18x, podendo também fazer pelo Bndes em 48x se for necessário.

Pensem nisso e divulguem a ferramenta, precisamos de vagas sendo ofertadas no linkedin e no infojobs sobre as ferramentas da PcSoft.... assim quando vermos isso a ferramenta conquistou o mercado e por consequencia voces vao conquistar excelentes projetos bem rentáveis.

Esses são os meus votos de que esse objetivo alcançaremos em breve e nesse dia terei concluido mais uma fase e compromisso com a PcSoft.

Forte abraço a todos, e grande sucesso com a ferramenta.

Conto com vocês!!!

--
Adriano Jose Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
______________________________________________
Membro registado
13 mensagems
Popularité : +9 (9 votes)
Publicado em dezembro, 30 2015 - 8:42 PM
Estava com problema qdo chamava uma rotina da dll...e essa rotina usava uma procedure interna da própria dll...

Se eu chamasse a rotina e essa nao usasse somente ela e nao chamasse nenhuma outra rotina interna... funcionava perfeitamente..
ex... (ao salvar um campo da tabela liberacao..)
liberacao.hora = timetointeger(timeSys()) + 1
funcionava Normalmente...


porém se eu tentasse chamar uma procedure a qual faz isso..
Ex..
liberacao.Hora = converteHoraparaInteiro(timeSys())

Onde:
Procedure ConverteHoraparaInteiro(pHora)
xHoraInteiro is Numeric = timetointeger(pHora) +1
result xHoraInteiro

estava ocorrendo erro!!


entao..eliminei o result e tentei trabalhar com variavel global...

Global
gnHoraInteiro is Numeric = 0

converteHoraparaInteiro(timeSys())
liberacao.hora = gnhoraInteiro

Procedure ConverteHoraparaInteiro(Phora)
gnHoraInteiro = 0
gnHoraInteiro = timetointeger(phora) +1


dessa forma se eu tivesse declarado a variavel gnHoraInteiro na DLL e no Projeto funcionava..porém se eu tivesse declarado apenas na DLL ..retornava que a variavel nao existia e se eu tivesse apenas no projeto retornava: "Compilation errors found in code..."

Não contente com esses erros...deletei tudo e importei novamente as rotinas DLL..então eis que para minha surpresa...começou a funcionar normalmente a opção que estava dando erro:

liberacao.Hora = converteHoraparaInteiro(timeSys())

Onde:
Procedure ConverteHoraparaInteiro(pHora)
xHoraInteiro is Numeric = timetointeger(pHora) +1
result xHoraInteiro

Para os que tiverem mesmo problema que tive, tentem excluir tudo e importar novamente..para mim funcionou..rs
Membro registado
3.651 mensagems
Popularité : +175 (223 votes)
Publicado em junho, 07 2016 - 9:00 PM
Prezados,

Para pegar um valor de um ponteiro de memória antes de usar ele *cstring do Clarion, segue exemplo do Windev:

nStringAddress is system int
API(<DLL>, <Function>, &nStringAddress)
sString is string
sString = StringRetrieve(nStringAddress, srASCIIZAddress)



Link complementar

API (FUNCAO)

http://doc.windev.com/en-US/…

Executa uma função encontrada em uma DLL externa. Esta função pode ser uma função do Windows API. As funções acessíveis por API são as funções das bibliotecas padrão do Windows (USER32, KERNEL32, GDI32, etc.).

A função pode ser identificado por:

o seu nome.
seu número.
seu endereço.

Você também tem a capacidade de usar uma API Descrição variável. Para as APIs chamados várias vezes na mesma aplicação ou que os parâmetros de uso de tipos específicos, recomendamos que você use uma descrição variável API com o uso direto (sem chamar API ).

notas :

Esta função é equivalente a CallDLL32 .
Se a função para executar contém parâmetros QWORD, você deve usar uma API Descrição variável (Sintaxe 4) .

API ( "USER32" , "SendMessageA" , hWnd , wMsg , lParam1 , lParam2 )



Sintaxe

Executando uma função de uma DLL externo ou uma função da API do Windows identificado por seu nome de esconder os detalhes
<Result> = API (<DLL Name>, <nome da função> [, <parâmetro 1> [, <Parâmetro 2> [, ...]]])
<Resultado>: inteiro de 4 bytes em 32 bits, 8-byte inteiro em 64 bits

O resultado da execução de <nome da função>. Este resultado pode ser um código de erro. O tipo de este resultado depende da função de execução. Ver a documentação sobre esta função para mais detalhes.
O resultado da função não será reactivado se o tamanho exceder o tamanho do número inteiro definido para a plataforma.

<DLL Name>: Sequência de caracteres (com aspas)

Nome da biblioteca (DLL) que contém a função a ser executada.

<Nome da Função>: Sequência de caracteres (com aspas)

Nome da função a executar. Esta função deve ser encontrada na DLL especificado.

<Parâmetros 1>: tipo correspondente ao parâmetro

Primeiro parâmetro que deve ser passado para a função. Estes parâmetros devem ter o mesmo tipo que os parâmetros esperados pela função. Pode ser usado:

os tipos "simples" (ver notas),
as estruturas (ver notas),
um nome de procedimento WLanguage. Este procedimento será chamado pela função da DLL (consulte os comentários).

<Parâmetros 2>: tipo correspondente ao parâmetro

Segundo parâmetro que deve ser passado para a função. Estes parâmetros devem ter o mesmo tipo que os parâmetros esperados pela função. Pode ser usado:

os tipos "simples" (ver notas),
as estruturas (ver notas),
um nome de procedimento WLanguage. Este procedimento será chamado pela função da DLL (consulte os comentários).

Executando uma função de uma DLL externo ou uma função da API do Windows identificado pelo seu número esconder os detalhes
<Result> = API (<DLL Name>, <Número Função> [, <parâmetro 1> [, <Parâmetro 2> [, ...]]])
<Resultado>: inteiro de 4 bytes em 32 bits, 8-byte inteiro em 64 bits

O resultado da execução de <nome da função>. Este resultado pode ser um código de erro. O tipo de este resultado depende da função de execução. Ver a documentação sobre esta função para mais detalhes.
O resultado da função não será reactivado se o tamanho exceder o tamanho do número inteiro definido para a plataforma.

<DLL Name>: Sequência de caracteres (com aspas)

Nome da biblioteca (DLL) que contém a função a ser executada.

<Função Número>: Integer

Número da função a ser executada. Esta função deve ser encontrada na DLL especificado.

<Parâmetros 1>: tipo correspondente ao parâmetro

Primeiro parâmetro que deve ser passado para a função. Estes parâmetros devem ter o mesmo tipo que os parâmetros esperados pela função. Pode ser usado:

os tipos "simples" (ver notas),
as estruturas (ver notas),
um nome de procedimento WLanguage. Este procedimento será chamado pela função da DLL (consulte os comentários).

<Parâmetros 2>: tipo correspondente ao parâmetro

Segundo parâmetro que deve ser passado para a função. Estes parâmetros devem ter o mesmo tipo que os parâmetros esperados pela função. Pode ser usado:

os tipos "simples" (ver notas),
as estruturas (ver notas),
um nome de procedimento WLanguage. Este procedimento será chamado pela função da DLL (consulte os comentários).

Executando uma função de uma DLL externo ou uma função da API do Windows identificado pelo seu endereço de esconder os detalhes
<Result> = API (<Function Address> [, <parâmetro 1> [, <Parâmetro 2> [, ...]]])
<Resultado>: inteiro de 4 bytes em 32 bits, 8-byte inteiro em 64 bits

O resultado da execução de <nome da função>. Este resultado pode ser um código de erro. O tipo de este resultado depende da função de execução. Ver a documentação sobre esta função para mais detalhes.
O resultado da função não será reactivado se o tamanho exceder o tamanho do número inteiro definido para a plataforma.

<Function Address>: Integer

Endereço na memória da função para ser executado.

<Parâmetros 1>: tipo correspondente ao parâmetro

Primeiro parâmetro que deve ser passado para a função. Estes parâmetros devem ter o mesmo tipo que os parâmetros esperados pela função. Pode ser usado:

os tipos "simples" (ver notas),
as estruturas (ver notas),
um nome de procedimento WLanguage. Este procedimento será chamado pela função da DLL (consulte os comentários).

<Parâmetros 2>: tipo correspondente ao parâmetro

Segundo parâmetro que deve ser passado para a função. Estes parâmetros devem ter o mesmo tipo que os parâmetros esperados pela função. Pode ser usado:

os tipos "simples" (ver notas),
as estruturas (ver notas),
um nome de procedimento WLanguage. Este procedimento será chamado pela função da DLL (consulte os comentários).

Executando uma função de uma DLL externo ou uma função da API do Windows identificado por uma variável API Descrição esconder os detalhes
<Result> = API (<API para Executar> [, <parâmetro 1> [, <Parâmetro 2> [, ...]]])
<Resultado>: inteiro de 4 bytes em 32 bits, 8-byte inteiro em 64 bits

O resultado da execução de <API para Executar>. Este resultado pode ser um código de erro. O tipo de este resultado depende da função de execução. Ver a documentação sobre esta função para mais detalhes.
O resultado da função não será reactivado se o tamanho exceder o tamanho do número inteiro definido para a plataforma.

<API para Executar>: API Descrição variável

API Descrição variável que contém as características da função a ser executada.

<Parâmetros 1>: tipo correspondente ao parâmetro

Primeiro parâmetro que deve ser passado para a função. Estes parâmetros devem ter o mesmo tipo que os parâmetros esperados pela função. Pode ser usado:

os tipos "simples" (ver notas),
as estruturas (ver notas),
um nome de procedimento WLanguage. Este procedimento será chamado pela função da DLL (consulte os comentários).

<Parâmetros 2>: tipo correspondente ao parâmetro

Segundo parâmetro que deve ser passado para a função. Estes parâmetros devem ter o mesmo tipo que os parâmetros esperados pela função. Pode ser usado:

os tipos "simples" (ver notas),
as estruturas (ver notas),
um nome de procedimento WLanguage. Este procedimento será chamado pela função da DLL (consulte os comentários).

Observações

controlos efectuados

API é protegido contra a "falhas de proteção geral" na função chamada. No entanto, um erro de WLanguage é acionado se este tipo de erro ocorre.
Para as funções seguintes o protótipo chamada PASCAL (especialmente as funções do Windows API), é realizada uma verificação simples sobre o número de parâmetros passados ​​para a função. Um erro de WLanguage ocorre em caso de discrepância.

Gerenciando os erros
Ao executar funções da API do Windows, se o resultado retornado corresponde a um erro, use ErrorInfo (associado ao errSystemCode ou errSystemMessage constante) para descobrir os detalhes do erro.

Carregar e descarregar a DLL
API carrega automaticamente o DLL, se necessário, em seguida, ele descarrega-lo (se ele foi carregado). Este mecanismo pode ser muito lento, exceto para as DLLs do sistema (kernel, usuário, GDI).

Para otimizar a velocidade de execução, aconselhamo-lo a carregar a DLL uma vez com LoadDLL e descarregá-lo com FreeDLL quando ele não é mais usado.

Parâmetros que devem ser passados ​​para a função do DLL
Estes parâmetros devem ter o mesmo tipo que os parâmetros esperados pela função.

Os tipos disponíveis são os seguintes:

Os tipos "simples" (inteiro, real e booleano). A utilização de outro tipo de WLanguage desencadeia um erro de WLanguage.
Se a função para executar espera um ponteiro ou um identificador do Windows, use um número inteiro sistema .
Se a função para executar espera um endereço, utilize o operador & .
Os "string" tipos.
Os tipos de estrutura.
Um nome de procedimento WLanguage . Este procedimento será chamado pela função da DLL (veja o parágrafo abaixo).
Os parâmetros dependem da função de execução. Consulte a documentação sobre essa função para obter mais detalhes.

Passar uma seqüência de caracteres para uma API ou recuperar uma string de uma API

No parâmetro de entrada, utilize o tipo string.
Por exemplo:
sString é cadeia

API (<DLL>, <função>, sString)

No parâmetro de saída, a linguagem C não é possível gerenciar facilmente as cordas dinâmicas. Portanto, você deve:
definir um tamanho máximo, com a "cadeia de" tipo.
Por exemplo:

sString é corda de 100
API (<DLL>, <função>, sString)
// no método em C:
// strncpy (PointerInC, "Test", 100)

recuperar os endereços das cordas em C (no entanto, neste caso, a seção de código em C deve "preservar" as cordas devolvidos), em seguida, transferir a string em uma variável string com StringRetrieve .
Por exemplo:
nStringAddress é int sistema

API (<DLL>, <função>, & nStringAddress)
sString é cadeia
sString = StringRetrieve (nStringAddress, srASCIIZAddress)
// no método em C: * PointerInC = "Test"

Em valor de retorno, recuperar os endereços das cordas em C (no entanto, neste caso, a seção de código em C deve "preservar" as cordas devolvidos), em seguida, transferir a string em uma variável string com StringRetrieve .
Por exemplo:

nStringAddress é int sistema
nStringAddress = API (<DLL>, <função>)
sString é cadeia
sString = StringRetrieve (nStringAddress, srASCIIZAddress)
// no método em C: Retorno PointerInC

Passando uma estrutura para uma API
As estruturas podem ser diretamente transmitido no parâmetro para as APIs, sem passar através do seu endereço. Para fazê-lo, os membros da estrutura tem de ser transmitido no parâmetro uma por uma.

Limite : Todos os membros da estrutura tem de ser alinhada com a 4 bytes.

Passando uma estrutura que contém uma seqüência de caracteres para uma API

Na entrada, o seguinte código deve ser utilizado:
Struct é a estrutura sString é cadeia END AStruct é struct API (<DLL>, <função>, & AStruct)



Na saída, a linguagem C não gere facilmente as cordas dinâmicas. Portanto, você deve:
definir um tamanho máximo e executar uma cópia na memória WLanguage.
Por exemplo:
sString é corda em 100
Struct é a estrutura aString é int END AStruct é Struct AStruct: aString = & sString API (<DLL>, <função>, & AStruct) // no método em C: // strncpy (CStruct-> PointerInC ", Teste ", 100)






recuperar o endereço das cordas em C (no entanto, neste caso, a seção de código em C deve "preservar" as cordas devolvidos).
Por exemplo:
sString é cadeia
Struct é a estrutura aString é int END AStruct é Struct API (<DLL>, <função>, & AStruct) sString = StringRetrieve (AStruct: aString, srASCIIZAddress) // no método em C: StructInC-> PointerInC = "Test"





Procedimento chamado no CallBack
Algumas funções do Windows API esperar que o endereço de um procedimento de "retorno de chamada" em parâmetro: este procedimento será chamado de volta pela função do API.

Por exemplo: a API EnumWindows é usado para listar todas as janelas janelas abertas em um computador. Esta função espera que o endereço de um procedimento no parâmetro: este procedimento será chamado sempre que uma janela seja encontrado.

Nota : Os procedimentos de chamada de retorno pode ser utilizada em 32 bits e de 64 bits.

Para usar um procedimento de retorno de chamada em WLanguage:

1. Crie o procedimento de retorno de chamada em seu projeto
Para recuperar os parâmetros, você deve descrever exatamente os parâmetros esperados pela função "CallBack". Caso contrário, "falhas de proteção geral" pode ocorrer.
PROCESSO <Nome do Procedimento> (<Parâm1> é <Type1> ... <Param2> é <Type2>)

notas :

Os tipos devem corresponder às descritas na documentação da API.
A convenção de chamada da DLL funções "retorno de chamada" deve ser "stdcall" ou "cdecl". Por padrão, a convenção de chamada é considerada como sendo "stdcall". A chamada de retorno "cdecl" pode ser declarada por meio do atributo "convenção de chamada". O protótipo da função torna-se:
PROCESSO <Nome do Procedimento> (<Parâm1> é <Type1> ... <Param2> é <Type2>) <convenção chamada = CDECL>
Os parâmetros devem, necessariamente, ser passado por valor. Para recuperar um parâmetro através do endereço:
Use um número inteiro.
Com Transferência , recuperar ou atribuir o valor real.

2. Modificar a chamada para a função em conformidade. Use a seguinte sintaxe:
API (<DLL Name>, <nome da função>, <Nome do Callback Procedimento>)

Veja o exemplo completo para mais detalhes.

WINDEVWebDev - Código ServidorWINDEV móvelRelatórios e ConsultasWindows mobilecódigo de utilizador (UMC)

Vários

API e CallDLL32 não bloquear os outros segmentos.
Se a função da API chamada modifica as configurações regionais do sistema, as configurações regionais anteriores são restauradas.

APIParameter é usado para configurar o comportamento padrão dessas funções.

Nota : Até a versão 100045:

API e CallDLL32 bloquear os outros segmentos.
Se a função da API chamada modifica as configurações regionais do sistema (idiomas, casas decimais, ...), as configurações regionais anteriores não serão restauradas.

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/