Sim, é possível, dentro de um Variant pode ser colocado um novo
SafeArray (existem os métodos SetSafeArray e GetSafeArray na classe
Variant), portanto a estrutura é ilimitada, quantos níveis vc quiser.
Quanto ao erro, seu parâmetro é String? Se for, pode estar faltando a
definição do tamanho do buffer com a função SalStrSetBufferLength. Esse
erro exatamente eu nunca tive.
Sds,
Erasmo
On 27/3/2009 12:51, Claudio Augusto Felix Pinto wrote:
Erasmo,
Muito obrigado pelo retorno, já me deu uma luz para resolver o
problema. No entanto, ao implementar sua sugestão, acabei me deparando
com outro problema que ocorre mesmo em chamadas com parâmetros
simples. Estranho que sempre consegui executar a DLL com parâmetros
simples, mas agora estou recebendo a mensagem "Reference to null user
defined variable". Talvez quem gerou essa DLL fez alguma definição
diferente do que havia nas outras em que eu trabalhei anteriormente
com sucesso. Estou tentando resolver primeiro esse problema para
depois voltar a testar usando parâmetros do tipo estrutura.
Erasmo, eu observei que você me deu um exemplo de dado estruturado
onde cada item da estrutura é uma estrutura simples. Seria possível
implementar em Centura quando um dos itens da estrutura é uma outra
estrutura como uma tabela, por exemplo? Na DLL que eu quero acessar
geralmente no seu parâmetro de retorno um dos itens da estrutura é uma
tabela, ou seja, é uma outra estrutura de dado, que por sua vez pode
ter um item que é ele também uma outra tabela. Isso é possível de
implementar no Centura?
Caso não seja possível, a alternativa que pensei é fazer a chamada e a
DLL colocaria os dados estruturados do parâmetro de retorno em tabelas
temporárias do banco de dados, através das quais o Centura obteria o
retorno.
Atenciosamente,
Claudio Augusto
------------------------------------------------------------------------
*De:* owner-sql...@virtualand.net [mailto:owner-sql...@virtualand.net]
*Em nome de *Erasmo
*Enviada em:* quinta-feira, 26 de março de 2009 14:35
*Para:* sqlwin@virtualand.net
*Assunto:* Re: [sqlwin] Passagem de Estruturas entre o Centura e uma DLL
Cláudio,
Crie um objeto/variável do tipo SafeArray, execute os métodos Create e
Put (específicos para cada tipo) e utilize na função de sua DLL, por
exemplo:
!!CB!! 134
Function: Teste
Description:
Returns
Parameters
Static Variables
Local variables
: saArray
Class: SafeArray
: vItem1
Class: Variant
: vItem2
Class: Variant
: vItem3
Class: Variant
Actions
! Cria um SafeArray de Objetos com três posições
Call saArray.Create( VT_VARIANT, 3, 0 )
! Seta o primeiro elemento, indice 0 - exemplo: Number
Call vItem1.SetNumber( 10, VT_I2 )
Call saArray.PutVariant( vItem1, 0 )
! Seta o segundo elemento, indice 1 - exemplo: String
Call vItem2.SetString( "teste" )
Call saArray.PutVariant( vItem2, 1 )
! Seta o terceiro elemento, indice 2 - exemplo: Date
Call vItem2.SetDate( SalDateCurrent( ) )
Call saArray.PutVariant( vItem3, 2 )
! Usa na chamada da DLL
Call MinhaDll (saArray)
Sds,
Erasmo
--
Erasmo Bispo de Oliveira Junior
Gerente de Pesquisa e Desenvolvimento
Softway - Softcomex Informática Ltda.
Pabx: +55 (19) 3344.9200
Direto:+55 (19) 3344.9361
Fax: +55 (19) 3344.9240
e-mail: erasmo.olive...@sfw.com.br <mailto:erasmo.olive...@sfw.com.br>
web: http://www.softcomex.com.br
Antes de imprimir esta mensagem, pense em sua responsabilidade e
compromisso com o meio ambiente!
On 26/3/2009 12:45, Claudio Augusto Felix Pinto wrote:
Antes de mais nada queria compartilhar a minha satisfação em poder
participar desse seleto grupo, agora que consegui a inscrição no
mesmo. Nessa minha primeira postagem, uma dúvida sobre tipo de dado
estruturado no Centura 2.0.
Amigos, abri uma DLL feita em VB no Centura 2.0 usando o "ActiveX
Explorer" do centura. O Centura gerou a APL com os métodos definidos
na DLL (ou melhor, na TLB). Um dos métodos retorna uma estrutura
composta (tipo registro) de itens simples (como um numérico) e
complexos (como uma tabela). Ao gerar a "Functional Class" para esse
método, o Centura definiu esse parâmetro (que retorna uma estrutura de
registro) como sendo do tipo "SafeArray".
Ocorre que, até onde eu entendo, o SafeArray me pareceu ser um array
de um tipo de dado simples, e não um array de uma estrutura. Me
pareceu ser assim porque uma vez declarada a variável X como sendo do
tipo ArraySafe, eu preciso chamar o create dela: X.Create(p1, p2, p3),
no qual o parâmetro p1 vai definir o tipo de dado do Safearray.
Olhando o help do centura, em "Data type mappings", verifiquei que os
tipos de dados suportados são sempre tipos simples. Não vi nenhuma
opção que suporte uma estrutura.
A propósito, também não sei se o centura suporta a criação de um tipo
de dado estruturado (ou tipo registro) em form. Quando tentei usar
StructPoint na sessão "Variables", ele não permitiu. Me parece que ele
aceita o "Structpoint" apenas na sessão "External Function -> Library
name". No entanto, eu precisava definir um tipo de dado estruturado no
escopo do form (para usá-lo como parâmetro na chamada ao método) e não
no escopo de uma função externa.
Resumindo, eu gostaria de saber se o Centura permite ou não passagem
de parâmetros do tipo "Estrutura" de/para uma DLL e, em caso positivo,
como eu faço para montar a estrutura desse parâmetro que o Centura
definiu como sendo do tipo "SafeArray" ?
Atenciosamente,
Claudio Augusto
--
Erasmo Bispo de Oliveira Junior
Gerente de Pesquisa e Desenvolvimento
Softway - Softcomex Informática Ltda.
Pabx: +55 (19) 3344.9200
Direto:+55 (19) 3344.9361
Fax: +55 (19) 3344.9240
e-mail: erasmo.olive...@sfw.com.br
web: http://www.softcomex.com.br
Antes de imprimir esta mensagem, pense em sua responsabilidade e
compromisso com o meio ambiente!