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
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

 

 

Responder a