dll em C#?

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

Moderador: Moderadores

pena
Usuário Nível 3
Usuário Nível 3
Mensagens: 331
Registrado em: 06 Jul 2004 18:08
Localização: CACHOEIRA DO SUL-RS

dll em C#?

Mensagem por pena »

Alguem sabe com ler Dll desenvolvida em C# ?
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: dll em C#?

Mensagem por alxsts »

Olá!

Creio que a linguagem em que foi escrita a DLL não importa muito. Se você tem a DLL registrada tem que saber usá-la.
Peguei o código abaixo de um tópico postado pelo Sygecon. Tem um exemplo de como carrecar a DLL e executar um de seus métodos. Note que no exemplo, o método "GetSerialNumber" recebe dois parâmetros.

Faça um teste com a DLL que precisa usar e, se possível, informe o que ocorreu.

Código: Selecionar todos

******************
FUNCTION SERIAL_HD
******************
Local TDLL:=LoadLibrary("DiskSerial.dll"), RETPORTA1, lpBuffer:=SPACE(512)
IF TDLL=0
   RETURN("Erro na DLL")
   FreeLibrary( TDLL )
ENDIF
RETPORTA1:=DLLCALL(TDLL,32,"GetSerialNumber",0,@lpBuffer )
FreeLibrary( TDLL )
RETURN(lpBuffer)
[]´s
Alexandre Santos (AlxSts)
pena
Usuário Nível 3
Usuário Nível 3
Mensagens: 331
Registrado em: 06 Jul 2004 18:08
Localização: CACHOEIRA DO SUL-RS

Re: dll em C#?

Mensagem por pena »

vou testar, obg pela atenção
lucimauro
Usuário Nível 3
Usuário Nível 3
Mensagens: 465
Registrado em: 21 Set 2004 21:02
Localização: Sobral-CE

dll em C#?

Mensagem por lucimauro »

Caro alxsts voce saberia me dizer qual biblioteca tenho que adiconar a meus arquivo para a funcao loadlibrary funcione, eu estou usando harbour 3.00 e quando mando compilar diz que essa funcao nao existe.
Desde ja agradeço
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

dll em C#?

Mensagem por alxsts »

Caro Lucimauro,

Não posso dizer com certeza, pois não mexo com Harbour. Já mexi com xHarbour.

Fiz uma busca no fórum e achei este trecho de código, postado pelo Itamar Lins:

Código: Selecionar todos

/*
 * $Id: testdll.prg 14688 2010-06-04 13:32:23Z vszakats $
 */

/*
 * Harbour Project source code:
 *    DLL call demonstration.
 *
 * Copyright 2008 Viktor Szakats (harbour.01 syenar.hu)
 * www - http://harbour-project.org
 *
 */

#include "simpleio.ch"

#include "dll.ch"

#define MAX_PATH 260

PROCEDURE Main()
   LOCAL hDLL
   LOCAL cData

   #if defined( __PLATFORM__WINDOWS )

   IF hb_FileExists( "pscript.dll" )
      hDLL := DllLoad( "pscript.dll" )
      cData := Space( 24 )
      DllCall( hDll, DLL_OSAPI, "PSGetVersion", @cData )
      ? ">" + cData + "<"
      DllUnload( hDLL )

      // ; Testing failure 1
      hDLL := DllLoad( "pscript.dll" )
      cData := Space( 24 )
      DllCall( hDll, DLL_OSAPI, "PSGet__Version", @cData )
      ? ">" + cData + "<"
      DllUnload( hDLL )
   ENDIF

   // ; Testing failure 2
   hDLL := DllLoad( "nothere.dll" )
   cData := Space( 24 )
   DllCall( hDll, NIL, "PSGetVersion", @cData )
   ? cData
   DllUnload( hDLL )
Parece que tem que usar DllLoad() para carregar a DLL, DllCall() para chamar os métodos e DllUnload() para descarregar a DLL.

Qualquer coisa mande uma MP para ele.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

dll em C#?

Mensagem por asimoes »

Lucimauro

Um exemplo simples com harbour 3.0
Biblioteca para este teste: hbwin

Código: Selecionar todos

FUNCTION MAIN
#include "hbdyn.ch"
cCep:="20735050"
nHandleDLL:=HB_LibLoad("UrlMon.dll") 

nStatus:=HB_DynCall( { "URLDownloadToFileA", nHandleDLL,HB_DYN_CALLCONV_STDCALL},0,"http://cep.republicavirtual.com.br/web_cep.php?cep=" + cCep + "&formato=xml","LOGRADOURO.XML",0,0)
HB_LibFree(nHandleDLL)

IF File("LOGRADOURO.XML")
   cBuf:=HB_AnsiToOem(FileStr("LOGRADOURO.XML"))
ELSE
   Alert("A consulta de CEP est  indispon¡vel.",{"Ok"}) 
   RETURN .T.
ENDIF

cRes:=Upper(SubStr(cBuf, AT('<resultado>', cBuf) + 11, AT('</resultado>', cBuf) - (AT('<resultado>', cBuf) + 11)))
   
IF cRes = "1"
   cResTxt  := Upper(SubStr(cBuf, AT('<resultado_txt>', cBuf) + 15, AT('</resultado_txt>', cBuf) - (AT('<resultado_txt>', cBuf) + 15)))
   cTipo    := Upper(SubStr(cBuf, AT('<tipo_logradouro>', cBuf) + 17, AT('</tipo_logradouro>', cBuf) - (AT('<tipo_logradouro>', cBuf) + 17)))
   cEnd     := RetiraAcentos(Upper(cTipo+" "+SubStr(cBuf, AT('<logradouro>', cBuf) + 12, AT('</logradouro>', cBuf) - (AT('<logradouro>', cBuf) + 12))))
   cBai     := RetiraAcentos(Upper(SubStr(cBuf, AT('<bairro>', cBuf) + 8, AT('</bairro>', cBuf) - (AT('<bairro>', cBuf) + 8))))
   cCid     := RetiraAcentos(Upper(SubStr(cBuf, AT('<cidade>', cBuf) + 8, AT('</cidade>', cBuf) - (AT('<cidade>', cBuf) + 8))))
   cUF      := Upper(SubStr(cBuf, AT('<uf>', cBuf) + 4, 2))
ELSE
   cResTxt  := "O CEP "+Transform(cCep,"@R 99.999-999")+" é Inválido."
   cTipo    := ""
   cEnd     := ""
   cBai     := ""
   cCid     := ""
   cUF      := ""
ENDIF

   cMess   += "Resposta do servidor.: "+cResTxt                 + HB_OsNewLine()
   cMess   += "Tipo de logradouro...: "+HB_OemtoAnsi(cTipo)     + HB_OsNewLine()
   cMess   += "Logradouro...........: "+HB_OemtoAnsi(cEnd)      + HB_OsNewLine()
   cMess   += "Bairro...............: "+HB_OemtoAnsi(cBai)      + HB_OsNewLine()
   cMess   += "Cidade...............: "+HB_OemtoAnsi(cCid)      + HB_OsNewLine() 	  
   cMess   += "UF...................: "+HB_OemtoAnsi(cUF)       + HB_OsNewLine() 	   	  

   IF cRes == "0"
      cVar0    :=Space(8)
      cCid     :="RIO DE JANEIRO"
      cUF      :="RJ"
   ENDIF

RETURN Nil

FUNCTION RetiraAcentos(cPalavra)
LOCAL i:=0,;
      cAcento:= '',;
      cRetiraAcento:= ''
    FOR I = 1 To Len(cPalavra)
        cAcento:=SUBST(cPalavra, I, 1)
        DO CASE
        CASE cAcento $ "µÇ¶·Ž"
           cAcento = "A"
        CASE cAcento $ "ÓÔÒ"
           cAcento = "E"
        CASE cAcento $ "ÖØÞ×"
           cAcento = "I"
        CASE cAcento $ "àåâ™"
           cAcento = "O"
        CASE cAcento $ "éëêš"
           cAcento = "U"
        CASE cAcento $ " Æƒ…„"
           cAcento = "a"
        CASE cAcento $ "‚‰Šˆ"
           cAcento = "e"
        CASE cAcento $ "¡‹Œ"
           cAcento = "i"
        CASE cAcento = "¢ä“”"
           cAcento = "o"
        CASE cAcento $ "£—–"
           cAcento = "u"
        CASE cAcento $ "‡"
           cAcento = "c"
        CASE cAcento $ "€"
           cAcento = "C"
        ENDCASE
        cRetiraAcento += cAcento
    NEXT
RETURN cRetiraAcento
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
lucimauro
Usuário Nível 3
Usuário Nível 3
Mensagens: 465
Registrado em: 21 Set 2004 21:02
Localização: Sobral-CE

dll em C#?

Mensagem por lucimauro »

Obrigdo por me ajudar com seu exemplo

Mais como to querendo usar a dll da daruma(darumaframeowork.dll) acho que nao ta dando certo, dar uma bocado de erro e pode para fechar o sistema.

Eu tambem tenteu com o comando loadlibrary esse nao dar erro mais quando chamo a funcao dllcall dar erro.
voce teria outros exemplos ai.

desde ja agradeço
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

dll em C#?

Mensagem por asimoes »

Alguns testes que eu fiz com uma dll que eu fiz em delphi:

//Retorna a string
//cStatus:=hb_dynCall( { "pcDLLVersion", "Project2.dll",hb_bitOr( HB_DYN_CTYPE_CHAR_PTR , HB_DYN_CALLCONV_CDECL )})
//info(cStatus)

//Retorna a string
//cStatus:=hb_dynCall( { "Nada", "Project2.dll",hb_bitOr( HB_DYN_CTYPE_CHAR_PTR , HB_DYN_CALLCONV_CDECL )},'TESTE COM DELPHI')
//info(cStatus)

//Retorna a string
//cStatus:=hb_dynCall( { "TrimAllChar", "Project2.dll",hb_bitOr( HB_DYN_CTYPE_CHAR_PTR , HB_DYN_CALLCONV_CDECL )},'TESTE COM DELPHI',' ')
//info(cStatus)

//Retorna a string
//cStatus:=hb_dynCall( { "DiaSemana", "Project2.dll",hb_bitOr( HB_DYN_CTYPE_CHAR_PTR , HB_DYN_CALLCONV_CDECL )},dtoc(Date()))
//info(cStatus)

Exemplo com a BEMATECH
Com a impressora BEMATECH MP2032_MP-4000TH
cImagem:="LOGOIMP.BMP"
nHandleDLL:=hb_LibLoad("MP2032.DLL") //Abre a DLL
nStatus:=hb_dynCall( { "ImprimeBitmap", nHandleDLL,HB_DYN_CALLCONV_STDCALL},cImagem,0) //Imprimir uma imagem
nStatus:=hb_dynCall( { "FormataTX", nHandleDLL,HB_DYN_CALLCONV_STDCALL},"Teste de Impressao",2, 0, 0, 0, 0) //Imprime texto
nStatus:=hb_dynCall( { "AcionaGuilhotina", nHandleDLL,HB_DYN_CALLCONV_STDCALL},1) //Corta o papel.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Responder