Quando quero acessar o webservice escrito em C# a partir do procedimento armazenado do Oracle através de uma dll externa (escrita em Delphi), aparece "coinitialize has not been chamada yet".
Não sei o que está acontecendo, espero que você possa me dar alguns conselhos.
1. Escrevi uma função addnumber no Oracle da seguinte maneira:
crie ou substitua a função my.add (a em binário_inteiro,b
em binário_inteiro) retorne binário_inteiro como
biblioteca externa my_lib
nome adicionar número
idioma c;
2. Escreveu um addtest de processo da seguinte forma:
crie ou substitua o procedimento my.addtest (um em
binário_inteiro,b em binário_inteiro)
como
retval binário_inteiro;
começar
retval:=adicionar(a,b);
fim;
3. Criado o pacote my_lib:
crie ou substitua a biblioteca my_lib como 'c:/oracle/ora92/bin/mywebservice.dll';
4. Crie um mywebservice.dll no Delphi e copie-o para o diretório $oracle_home$/bin. Existe um método:
interface
função addnumber(a:inteiro;b:inteiro):inteiro;cdecl;
....
implementação
procedimento dogetwebserviceerr(errmsg:string);
var
arquivo de log: arquivo de texto;
eu: inteiro;
começar
atribuaarquivo(logfile,'d:/test.txt');
tentar
reescrever (arquivo de log);
write(arquivo de log,errmsg);
finalmente
fechar arquivo(arquivo de log);
fim;
fim;
função addnumber(a:inteiro;b:inteiro):inteiro;
começar
tentar
resultado: = getmywebservicesoap().addnumber(a,b);
exceto
em e: exceção do dogetwebserviceerr(eemessage);
outro
resultado :=-1;
fim;
fim;
.....
Entre eles: getmywebservicesoap() é um método em mywebservice.pas que importei usando o importador wsdl.
Exportei esse método no arquivo de projeto da dll:
exportações
adicionar número;
5. Use C# para criar um serviço web chamado mywebservice em localhost. Existe um método web chamado addnumber, que é definido da seguinte forma:
[método web]
public int addnúmero(int a,int b)
{
retornar a+b;
}
6. Escrevi um cliente de formulário Windows em c# e testei o método web chamando a dll escrita em delphi acima.
[dllimport(dllpath,entrypoint = mywebservice.dll, charset = charset.auto, callconvention = callconvention.stdcall)]
private extern static int addnumber(int a,int b);
...
///Botão de teste
private void buttontestwebservice_click (remetente do objeto, system.eventargs e)
{
consle.write(adicionarnúmero(1,2));
}
7. O teste falhou no sql*plus Quando o arquivo test.txt foi aberto, o conteúdo era "coinitialize ainda não foi chamado. O código de teste é o seguinte".
execute addtest(1,1);
Se você modificar addnumber no delphi para
função addnumber(a:inteiro;b:inteiro):inteiro;
começar
tentar
resultado :=a+b;//Não chama webservice, calcula diretamente
exceto
em e: exceção do dogetwebserviceerr(eemessage);
outro
resultado :=-1;
fim;
fim;
A execução foi bem-sucedida.
As configurações de listener.ora e tnsnames.ora do oracle são as seguintes
# arquivo de configuração de rede listener.ora: c:/oracle/ora92/network/admin/listener.ora
# gerado pelas ferramentas de configuração do Oracle.
meu_extproc_listener =
(lista_endereço =
(endereço= (protocolo=ipc)
(chave = extproc)
)
)
sid_list_my_extproc_listener =
(lista_sid =
(sid_desc =
(nome_sid = extproc)
(oracle_home=c:/oracle/ora92)
(programa=c:/oracle/ora92/bin/extproc)
(envs=extproc_dlls=qualquer)
)
)
# arquivo de configuração de rede tnsnames.ora: c:/oracle/ora92/network/admin/tnsnames.ora
# gerado pelas ferramentas de configuração do Oracle.
extproc_connection_data.world =
(descrição =
(endereço = (protocolo = ipc)(chave = extproc))
(conectar_dados =
(sid=extproc)
)
)