Compatibilidade ActiveX

3 views
Skip to first unread message

Tiago Fucilini

unread,
Jul 7, 2009, 3:36:06 PM7/7/09
to ccppbrasil
Olá,

desenvolvi um controle activfeX em vc++ atl e preciso usar ele em
outras linguagem como delphi e vb. A maior parte das coisas funciona,
o problema esta na hora de passar algum parametro do tipo string,
creio que seja por cada linguagem tratar de um modo diferente as
cadeias de caracteres. O meu controle está preparado para receber um
BSTR.

Uma coisa que achei estranha é a seguinte: se eu usar o meu componente
no vb e mandar a string diretamente ex:

controle.nome = "controle"

funciona, já se eu tentar pegar o texto de um textbox não. ex:

controle.nome = textbox.text

alguem sabe como resolver esse problema.

Tiago Fucilini

Paulo Rogério Panhoto

unread,
Jul 7, 2009, 4:01:26 PM7/7/09
to ccppb...@googlegroups.com
So por curiosidade, você poderia definir o que é "não funciona"? É um
erro no VB? A sua rotina não é chamada? Ou ela é chamada e o valor que
vem pra ela vem diferente do que você esperava?

Wellington

unread,
Jul 7, 2009, 4:08:52 PM7/7/09
to ccppb...@googlegroups.com
Tiago,

Se me recordo de vb6, seria algo +/- assim

controle.nome = CStr(textbox.text)

A função CStr() converte o conteudo para string.

Espero que possa lhe ajudar


Abraços

Tiago Fucilini

unread,
Jul 7, 2009, 5:14:45 PM7/7/09
to ccppb...@googlegroups.com
Paulo,
o não funciona, quer dizer que a string não é passada e sim algum lixo ou outra coisa.

Wellington
jah tentei converter explicitamente que nem no seu exemplo e não ajudou.

2009/7/7 Paulo Rogério Panhoto <pa...@voicetechnology.com.br>

Rodrigo Strauss

unread,
Jul 7, 2009, 11:48:07 PM7/7/09
to ccppb...@googlegroups.com
Sem o trecho de código da atribuição fica difícil... Coloque o trecho
C++ e o trecho VB.

Não funcionou == ??

Qual o erro? Você recompilou a aplicação VB que usa o seu componente ATL?

Não precisa de CStr não, a atribuição direta deveria funcionar já que
é tudo BSTR.

Rodrigo Strauss
http://www.1bit.com.br

2009/7/7 Tiago Fucilini <tiag...@gmail.com>:

Caloni

unread,
Jul 8, 2009, 8:11:23 AM7/8/09
to ccppbrasil
Aproveite e mande-nos a definição da interface com os atributos IDL
dos parâmetros.

On Jul 8, 12:48 am, Rodrigo Strauss <rodr...@1bit.com.br> wrote:
> Sem o trecho de código da atribuição fica difícil... Coloque o trecho
> C++ e o trecho VB.
>
> Não funcionou == ??
>
> Qual o erro? Você recompilou a aplicação VB que usa o seu componente ATL?
>
> Não precisa de CStr não, a atribuição direta deveria funcionar já que
> é tudo BSTR.
>
> Rodrigo Strausshttp://www.1bit.com.br
>
> 2009/7/7 Tiago Fucilini <tiagof...@gmail.com>:

Tiago Fucilini

unread,
Jul 8, 2009, 9:29:30 AM7/8/09
to ccppb...@googlegroups.com
Trecho do componente em c++:
STDMETHODIMP CIDataBase::put_StringDeConexao(BSTR newVal)
{
    USES_CONVERSION;
    cnnString = OLE2A(newVal);
    propriedades[2]=true;
    return S_OK;
}

Trecho da interface para a propriedade StringDeConexão:
[propput, id(6), helpstring("property StringDeConexao")] HRESULT StringDeConexao([in] BSTR newVal);

Trecho em VB:
Private Sub InicializarBancoButtom_Click()
    StringConexaoText.Text = "driver={Microsoft Access Driver (*.mdb)};dbq=[\\10.1.1.19\TiagoTestes\Banco.mdb];Uid=Administrador;Pwd=xxxxxx"
    Set base = New BioToolsLib.CIDataBase
    base.StringDeConexao = StringConexaoText.Text
End Sub

Ai está os trechos de codigo. Debugando a aplicação no vb a StringConexaoText recebe o valor correto ja a base.StringDeConexão recebe uns caracteres invalidos.

2009/7/8 Caloni <wanderl...@gmail.com>

Tiago Fucilini

unread,
Jul 8, 2009, 6:19:06 PM7/8/09
to ccppb...@googlegroups.com
Conseguir resolver o problema, ele estava na funcao get e não na put da propriedade. Resolvi usando a funcão SysReAllocString. em vez de atribuir diretamente.

2009/7/8 Tiago Fucilini <tiag...@gmail.com>

Rodrigo Strauss

unread,
Jul 14, 2009, 9:41:10 PM7/14/09
to ccppb...@googlegroups.com
Se entendi bem, você estava devolvendo sua BSTR interna no get. O VB
desaloca sua BSTR automagicamente, já que pelas regras do COM é isso
que ele deveria fazer.

Sempre que um parâmetro for [out,retval], você deve devolver uma cópia
e o "chamador" deve desalocar.

Rodrigo Strauss
http://www.1bit.com.br

2009/7/8 Tiago Fucilini <tiag...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages