none
Interface VB¨com C++ RRS feed

  • Pergunta

  • Galera,
    Estou tentando fazer o código abaixo funcionar mas não obtive sucesso.

    Preciso receber no VB o ponteiro com o  endereço da função AbrirConfiguracao para enviar na chamada de outra função,

    Alguém pode me ajudar?
    Rogério.


    Segue o código problemático:

     

    In C++

    CRS2_API void* AbrirConfiguracao(const char* tipoCtrl, const char* tipoPersist, const char* tipoFormato, const char* tipoCripto, const char* flags, int* retorno)
    {
    //...
    }
    //--------------------------------------------------------------------
    Interfce to VB
    //---------
    void __stdcall stdAbrirConfiguracao(const char* tipoCtrl,
        const char* tipoPersist,
        const char* tipoFormato,
        const char* tipoCripto,
        const char* flags,
        int* retorno,
        void* retVal)
    {
    retVal = AbrirConfiguracao(tipoCtrl, tipoPersist, tipoFormato, tipoCripto, flags,retorno);
    };

    //Modules in VB
    Public Declare Sub stdAbrirConfiguracao Lib "CRS2Client.dll" ( _
                ByVal tipoCtrl As String, _
                ByVal tipoPersist As String, _
                ByVal tipoFormato As String, _
                ByVal tipoCripto As String, _
                ByVal flags As String, _
                ByRef retorno As Long, _
                ByRef X As Variant)

    sexta-feira, 16 de fevereiro de 2007 14:08

Todas as Respostas

  • É VB6 ou VB.NET?
    sexta-feira, 16 de fevereiro de 2007 18:12
  • Hmm, na verdade aquela Variant entrega que é VB6, bem como a trema do lado de "VB" no nome do tópico, que imagino ter sido uma tentativa de digitar o número 6 num teclado ABNT :-)

    Declare a DLL em VB assim:

    Public Declare Sub stdAbrirConfiguracao Lib  "CRS2Client.dll" ( _
                ByRef tipoCtrl As Any, _
                ByRef tipoPersist As Any, _
                ByRef tipoFormato As Any, _
                ByRef tipoCripto As Any, _
                ByRef flags As Any, _
                ByRef retorno As Long, _
                ByRef X As Long)

    Os primeiros cinco parâmetros da função em C++ são ponteiros const char, assim você poderia usar a função StrPtr() do VB6 para passar diretamente as strings à DLL já que elas não serão modificadas pela DLL, mas eu não gosto disso, acho melhor copiar antes as strings para um buffer formado por um array de bytes e passar o ponteiro para os buffers. Seria assim:

    ' API
    Public Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyW" ( _
            ByRef destination As Any, _
            ByVal source As Long) As Long

     

    ' Buffers. Todos com 21 elementos, aumente se as strings tiverem mais do que 21 caracteres.
    Dim tipoCtrl(20) As Byte
    Dim tipoPersist(20) As Byte
    Dim tipoFormato(20) As Byte
    Dim tipoCripto(20) As Byte
    Dim flags(20) As Byte
    ' Outras variáveis
    Dim retorno As Long
    Dim X As Long

    ' Copia as strings para os buffers, convertendo as strings para ANSI.
    Call lstrcpy(tipoCtrl(0), StrPtr(StrConv("tipoCtrl", vbFromUnicode)))
    Call lstrcpy(tipoPersist(0), StrPtr(StrConv("tipoPersist", vbFromUnicode)))
    Call lstrcpy(tipoFormato(0), StrPtr(StrConv("tipoFormato", vbFromUnicode)))
    Call lstrcpy(tipoCripto(0), StrPtr(StrConv("tipoCripto", vbFromUnicode)))
    Call lstrcpy(flags(0), StrPtr(StrConv("flags", vbFromUnicode)))

    ' Invoca a DLL passando os ponteiros para os buffers e as outras duas variáveis.
    Call stdAbrirConfiguracao(tipoCtrl(0), tipoPersist(0), tipoFormato(0), tipoCripto(0), flags(0), retorno, X)

    ' Exibe valores de retorno.
    Debug.Print retorno
    Debug.Print X

    Se você quiser exibir as strings a partir dos buffers, você deve converter o valor dos buffers para Unicode e retirar os caracteres nulos, assim:

     Dim s As String
     ' Converte conteúdo do aray tipoCtrl para string Unicode.
     s = StrConv(tipoCtrl(), vbUnicode)
     ' Retira caracteres nulos.
     s = Left$(s, InStr(s, Chr(0)) - 1)
     ' Exibe
     MsgBox s

     

    sábado, 17 de fevereiro de 2007 04:36