Oracle のストアド プロシージャから外部 DLL (Delphi で作成) を介して C# で作成された Web サービスにアクセスしたい場合、「coinitialize はまだ呼び出されていません」と表示されます。
何が起こっているのかわかりませんが、アドバイスをいただければ幸いです。
1. Oracle で関数 addnumber を次のように書きました。
関数 my.add を作成または置換します (binary_integer,b の a)
binary_integer) として binary_integer を返します
外部ライブラリ my_lib
名前追加番号
言語c。
2. 次のようにプロセス addtest を作成しました。
プロシージャ my.addtest (a の
binary_integer,b の binary_integer)
として
retval バイナリ_整数;
始める
retval:=add(a,b);
終わり;
3. my_lib パッケージを作成しました。
ライブラリ my_lib を「c:/oracle/ora92/bin/mywebservice.dll」として作成または置換します。
4. Delphi で mywebservice.dll を作成し、$oracle_home$/bin ディレクトリにコピーします。次の方法があります。
インタフェース
関数 addnumber(a:integer;b:integer):integer;cdecl;
....
実装
プロシージャ dogetwebserviceerr(errmsg:string);
変数
ログファイル: テキストファイル;
i:整数;
始める
assignfile(logfile,'d:/test.txt');
試す
リライト(ログファイル);
write(ログファイル、errmsg);
ついに
閉じるファイル(ログファイル);
終わり;
終わり;
関数 addnumber(a:integer;b:integer):integer;
始める
試す
結果 := getmywebservicesoap().addnumber(a,b);
を除外する
e: 例外 dogetwebserviceerr(eemessage);
それ以外
結果:=-1;
終わり;
終わり;
……
その中には: getmywebservicesoap() は、wsdl インポーターを使用してインポートした mywebservice.pas のメソッドです。
このメソッドを DLL のプロジェクト ファイルにエクスポートしました。
輸出
番号を追加します。
5. C# を使用して、mywebservice という名前の Web サービスを localhost に作成します。addnumber という名前の Web メソッドがあり、次のように定義されています。
[ウェブメソッド]
public int addnumber(int a,int b)
{
a+b を返します。
}
6. C# で Windows フォーム クライアントを作成し、上記の delphi で作成された DLL を呼び出して Web メソッドをテストしました。テストは成功しました。
[dllimport(dllpath,entrypoint = mywebservice.dll, charset = charset.auto,callingconvention =callingconvention.stdcall)]
private extern static int addnumber(int a,int b);
...
///テストボタン
private void buttontestwebservice_click(オブジェクト送信者、system.eventargs e)
{
consle.write(addnumber(1,2));
}
7. sql*plus でテストに失敗しました。test.txt ファイルを開くと、「coinitialize がまだ呼び出されていません」という内容でした。テストコードは次のとおりです。
addtest(1,1) を実行します。
Delphi の addnumber を次のように変更すると、
関数 addnumber(a:integer;b:integer):integer;
始める
試す
result :=a+b;//Webサービスを呼び出さず、直接計算します
を除外する
e: 例外 dogetwebserviceerr(eemessage);
それ以外
結果:=-1;
終わり;
終わり;
実行は成功しました。
oracleのlistener.oraとtnsnames.oraの構成は以下のとおりです。
#listener.ora ネットワーク構成ファイル: c:/oracle/ora92/network/admin/listener.ora
# Oracle 構成ツールによって生成されます。
my_extproc_listener =
(アドレスリスト =
(アドレス= (プロトコル=ipc)
(キー = extproc)
)
)
sid_list_my_extproc_listener =
(sid_list =
(sid_desc =
(sid_name = extproc)
(oracle_home = c:/oracle/ora92)
(プログラム= c:/oracle/ora92/bin/extproc)
(envs=extproc_dlls=任意)
)
)
# tnsnames.ora ネットワーク構成ファイル: c:/oracle/ora92/network/admin/tnsnames.ora
# Oracle 構成ツールによって生成されます。
extproc_connection_data.world =
(説明=
(アドレス = (プロトコル = ipc)(キー = extproc))
(接続データ =
(sid = extproc)
)
)