Wenn ich über eine externe DLL (in Delphi geschrieben) über die gespeicherte Prozedur von Oracle auf den in C# geschriebenen Webservice zugreifen möchte, wird „Coinitialize wurde noch nicht aufgerufen“ angezeigt.
Ich weiß nicht, was los ist, ich hoffe, Sie können mir einen Rat geben.
1. Ich habe in Oracle eine Funktion addnumber wie folgt geschrieben:
Erstellen oder ersetzen Sie die Funktion my.add (a in Binary_Integer,b
in „binary_integer“) gebe „binary_integer“ zurück als
externe Bibliothek my_lib
Name hinzufügenNummer
Sprache c;
2. Einen Prozess addtest wie folgt geschrieben:
Erstellen oder ersetzen Sie die Prozedur my.addtest (a in
binäre_Ganzzahl,b in binäre_Ganzzahl)
als
retval binäre_integer;
beginnen
retval:=add(a,b);
Ende;
3. Erstellt das my_lib-Paket:
Erstellen oder ersetzen Sie die Bibliothek my_lib als „c:/oracle/ora92/bin/mywebservice.dll“;
4. Erstellen Sie eine mywebservice.dll in Delphi und kopieren Sie sie in das Verzeichnis $oracle_home$/bin. Es gibt eine Methode:
Schnittstelle
Funktion addnumber(a:integer;b:integer):integer;cdecl;
....
Durchführung
procedure dogetwebserviceerr(errmsg:string);
var
Protokolldatei: Textdatei;
i:Ganzzahl;
beginnen
askfile(logfile,'d:/test.txt');
versuchen
rewrite(logfile);
write(logfile,errmsg);
Endlich
closefile(logfile);
Ende;
Ende;
Funktion addnumber(a:integer;b:integer):integer;
beginnen
versuchen
Ergebnis := getmywebservicesoap().addnumber(a,b);
außer
auf e: Ausnahme do dogetwebserviceerr(eemessage);
anders
Ergebnis :=-1;
Ende;
Ende;
.....
Darunter: getmywebservicesoap() ist eine Methode in mywebservice.pas, die ich mit dem WSDL-Importer importiert habe.
Ich habe diese Methode in die Projektdatei der DLL exportiert:
Exporte
addnumber;
5. Erstellen Sie mit C# einen Webdienst namens mywebservice auf localhost. Es gibt eine Webmethode namens addnumber, die wie folgt definiert ist:
[Webmethode]
public int addnumber(int a,int b)
{
gib a+b zurück;
}
6. Ich habe einen Windows-Formular-Client in C# geschrieben und die Webmethode getestet, indem ich die oben in Delphi geschriebene DLL aufgerufen habe. Der Test war erfolgreich.
[dllimport(dllpath,entrypoint = mywebservice.dll, charset = charset.auto,vocationconvention =callingconvention.stdcall)]
private extern static int addnumber(int a,int b);
...
///Test-Taste
private void buttontestwebservice_click(object sender, system.eventargs e)
{
consle.write( addnumber(1,2));
}
7. Der Test in sql*plus ist fehlgeschlagen. Als die Datei test.txt geöffnet wurde, lautete der Inhalt „Coinitialize wurde noch nicht aufgerufen“. Der Testcode lautet wie folgt
addtest(1,1) ausführen;
Wenn Sie addnumber in Delphi ändern zu
Funktion addnumber(a:integer;b:integer):integer;
beginnen
versuchen
result :=a+b;// Webservice nicht aufrufen, direkt berechnen
außer
auf e: Ausnahme do dogetwebserviceerr(eemessage);
anders
Ergebnis :=-1;
Ende;
Ende;
Die Ausführung ist erfolgreich.
Die Konfigurationen von listener.ora und tnsnames.ora von Oracle sind wie folgt
# listener.ora-Netzwerkkonfigurationsdatei: c:/oracle/ora92/network/admin/listener.ora
# von Oracle-Konfigurationstools generiert.
my_extproc_listener =
(address_list =
(Adresse= (Protokoll=IPC)
(Schlüssel = extproc)
)
)
sid_list_my_extproc_listener =
(sid_list =
(sid_desc =
(sid_name = extproc)
(oracle_home = c:/oracle/ora92)
(Programm= c:/oracle/ora92/bin/extproc)
(envs=extproc_dlls=any)
)
)
# tnsnames.ora Netzwerkkonfigurationsdatei: c:/oracle/ora92/network/admin/tnsnames.ora
# von Oracle-Konfigurationstools generiert.
extproc_connection_data.world =
(Beschreibung =
(Adresse = (Protokoll = ipc)(Schlüssel = extproc))
(connect_data =
(sid = extproc)
)
)