aRetorno := DLLCALL()

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

JOSE CAMARA
Usuário Nível 1
Usuário Nível 1
Mensagens: 15
Registrado em: 30 Abr 2014 01:39
Localização: SAO PAULOS

aRetorno := DLLCALL()

Mensagem por JOSE CAMARA »

Olá boa tarde aos amigos estou com uma dificuldade com relação a esse comando

aRetorno := DLLCALL(xdll_sat,32,"aCFeVender_SAT_Daruma",cString) eu uso assim no xHarbour

um amigo que usa o fivewim usa da seguinte forma

DLL32 aCFeVender_SAT_Daruma somente um exemplo dos comandos acontece que da forma que estou chamando
DLLCALL tenho um erro de kernel32

e no dele não acontece isso, queria saber se preciso fazer alguma alteração para o xharbour compilar da forma que ele usa no fivewin ou se tem outra maneira compatival para não ter mais o erro kernell32


obrigado atodos..
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

aRetorno := DLLCALL()

Mensagem por JoséQuintas »

Não sei como isso é no xHarbour.

De qualquer forma, tem um detalhe importantíssimo nas chamadas de DLL:
Variáveis ou ponteiros, e tamanho de strings

Se a função da DLL recebe um valor, passa a variável direto
Se a função da DLL usa "ponteiro", passa a variável por referência
Se a função da DLL vai modificar uma variável por referência que é string, é necessário reservar o tamanho adequado.

Aqui eu uso Harbour. Veja um exemplo:

Código: Selecionar todos

FUNCTION mywin_GetComputerName()

   LOCAL cComputerName := Space(255), nSize := 250

   CallDll( "GetComputerNameA", "kernel32.dll", @cComputerName, @nSize )
   cComputerName := TrimStringApi( cComputerName )
   RETURN AllTrim( cComputerName )
O tamanho máximo que a função pode retornar é 255, então preciso deixar a variável com esse tamanho.

Por exemplo, numa DLL que mexa com XML de nota fiscal eletrônica, pode ser necessário criar uma variável de 50KB, só pra não acontecer esse tipo de erro.

Se não fizer isso, quando a rotina for guardar uma string que não cabe, vai invadir a área de outra rotina, e é justamente aonde acontece o GPF.

Só lembrando:
Usar DLL no Harbour não significa que dá pra usar igual função do Harbour.
Geralmente a DLL é em outra linguagem de programação, e ela não segue as regras do Harbour.
Com certeza tem que tomar cuidado com os parâmetros, porque vai ter que respeitar as regras das duas linguagens de programação de uma vez.
O GPF é a forma que o Windows tem, pra bloquear seu aplicativo, e evitar que ele cause problemas aos demais aplicativos ou até ao próprio Windows, geralmente por causa dessa "invasão de memória".
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
JOSE CAMARA
Usuário Nível 1
Usuário Nível 1
Mensagens: 15
Registrado em: 30 Abr 2014 01:39
Localização: SAO PAULOS

aRetorno := DLLCALL()

Mensagem por JOSE CAMARA »

Obrigado pela dica José Quintas vou ver isso com calma. Valeu
Responder