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:
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?
> 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:
> 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:
> 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?
> Tiago Fucilini wrote:
> > 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:
> 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:
> > 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:
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=xxxx xx"
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.
> 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.
> > > 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:
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.
> 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=xxxx xx"
> 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.
>> 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.
>> > > 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:
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.
> 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.
>> 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=xxxx xx"
>> 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.
>>> 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.
>>> > > 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: