Cuando quiero acceder al servicio web escrito en C# desde el procedimiento almacenado de Oracle a través de un dll externo (escrito en Delphi), aparece "aún no se ha llamado a coinitialize".
No se que pasa, espero que me puedan dar algún consejo.
1. Escribí una función agregar número en Oracle de la siguiente manera:
crear o reemplazar la función my.add (a en binario_integer,b
en binario_integer) devuelve binario_integer como
biblioteca externa my_lib
nombre agregar número
idioma c;
2. Escribió una prueba de proceso de la siguiente manera:
crear o reemplazar el procedimiento my.addtest (a en
entero_binario,b en entero_binario)
como
retval binario_integer;
comenzar
valor de recuperación:=add(a,b);
fin;
3. Creó el paquete my_lib:
cree o reemplace la biblioteca my_lib como 'c:/oracle/ora92/bin/mywebservice.dll';
4. Cree un mywebservice.dll en Delphi y cópielo en el directorio $oracle_home$/bin. Hay un método:
interfaz
función addnumber(a:entero;b:entero):entero;cdecl;
....
implementación
procedimiento dogetwebserviceerr(errmsg:string);
var
archivo de registro: archivo de texto;
yo: entero;
comenzar
asignararchivo(archivo de registro,'d:/test.txt');
intentar
reescribir (archivo de registro);
escribir(archivo de registro,errmsg);
finalmente
closefile(archivo de registro);
fin;
fin;
función agregarnúmero(a:entero;b:entero):entero;
comenzar
intentar
resultado := getmywebservicesoap().addnumber(a,b);
excepto
en e: excepción do dogetwebserviceerr(eemessage);
demás
resultado:=-1;
fin;
fin;
.....
Entre ellos: getmywebservicesoap() es un método en mywebservice.pas que importé usando el importador wsdl.
Exporté este método en el archivo de proyecto de la dll:
exportaciones
agregar número;
5. Utilice C# para crear un servicio web llamado mywebservice en localhost. Existe un método web llamado addnumber, que se define de la siguiente manera:
[método web]
public int addnumber(int a,int b)
{
devolver a+b;
}
6. Escribí un cliente de Windows Form en C# y probé el método web llamando al dll escrito en Delphi arriba. La prueba fue exitosa.
[dllimport(dllpath,entrypoint = mywebservice.dll, charset = charset.auto, callconvention = callconvention.stdcall)]
privado externo estático int addnumber (int a, int b);
...
///Botón de prueba
botón de anulación privadotestwebservice_click(remitente del objeto, system.eventargs e)
{
consle.write( addnumber(1,2));
}
7. La prueba falló en sql*plus. Cuando se abrió el archivo test.txt, el contenido era "coinitialize aún no se ha llamado". El código de prueba es el siguiente.
ejecutar addtest(1,1);
Si modifica addnumber en Delphi a
función agregarnúmero(a:entero;b:entero):entero;
comenzar
intentar
resultado :=a+b;// No llame al servicio web, calcule directamente
excepto
en e: excepción do dogetwebserviceerr(eemessage);
demás
resultado:=-1;
fin;
fin;
La ejecución es exitosa.
Las configuraciones de listening.ora y tnsnames.ora de Oracle son las siguientes
# archivo de configuración de red listener.ora: c:/oracle/ora92/network/admin/listener.ora
# generado por las herramientas de configuración de Oracle.
my_extproc_listener =
(lista_direcciones =
(dirección= (protocolo=ipc)
(clave = extproc)
)
)
sid_list_my_extproc_listener =
(lista_sid =
(sid_desc =
(sid_name = extproc)
(oracle_home = c:/oracle/ora92)
(programa= c:/oracle/ora92/bin/extproc)
(envs=extproc_dlls=cualquiera)
)
)
# archivo de configuración de red tnsnames.ora: c:/oracle/ora92/network/admin/tnsnames.ora
# generado por las herramientas de configuración de Oracle.
extproc_connection_data.world =
(descripción =
(dirección = (protocolo = ipc)(clave = extproc))
(conectar_datos =
(sid = extproc)
)
)