Oracle의 저장 프로시저에서 외부 dll(Delphi로 작성된)을 통해 C#으로 작성된 웹 서비스에 접근하려고 하면 "coinitialize가 아직 호출되지 않았습니다"라는 메시지가 나타납니다.
무슨 일이 일어나고 있는지 모르겠습니다. 조언을 해주실 수 있기를 바랍니다.
1. Oracle에서 addnumber 함수를 다음과 같이 작성했습니다.
my.add 함수 생성 또는 교체(binary_integer,b의 a)
Binary_integer에서) Binary_integer를 다음과 같이 반환합니다.
외부 라이브러리 my_lib
이름 추가번호
언어 c;
2. 다음과 같이 addtest 프로세스를 작성했습니다.
my.addtest 프로시저 생성 또는 교체(
bin_integer,b in bin_integer)
~처럼
retval 바이너리_정수;
시작하다
retval:=추가(a,b);
끝;
3. my_lib 패키지를 생성했습니다.
my_lib 라이브러리를 'c:/oracle/ora92/bin/mywebservice.dll'로 생성하거나 교체합니다.
4. Delphi에서 mywebservice.dll을 생성하고 $oracle_home$/bin 디렉토리에 복사합니다.
인터페이스
함수 addnumber(a:정수;b:정수):정수;cdecl;
....
구현
절차 dogetwebserviceerr(errmsg:string);
var
로그파일: 텍스트파일;
i:정수;
시작하다
할당파일(로그파일,'d:/test.txt');
노력하다
다시 쓰기(로그 파일);
쓰기(로그파일,errmsg);
마지막으로
closefile(로그파일);
끝;
끝;
함수 addnumber(a:정수;b:정수):정수;
시작하다
노력하다
결과 := getmywebservicesoap().addnumber(a,b);
제외하고
e: 예외 dogetwebserviceerr(eemessage);
또 다른
결과 :=-1;
끝;
끝;
.....
그 중 getmywebservicesoap()은 wsdl 임포터를 사용하여 가져온 mywebservice.pas의 메소드입니다.
이 메서드를 dll의 프로젝트 파일로 내보냈습니다.
수출
번호 추가;
5. C#을 사용하여 localhost에 mywebservice라는 웹 서비스를 생성합니다. addnumber라는 웹 메서드가 있으며 이는 다음과 같이 정의됩니다.
[웹 메소드]
공개 int addnumber(int a,int b)
{
a+b를 반환합니다.
}
6. C#으로 Windows Form 클라이언트를 작성하고 위의 Delphi로 작성된 dll을 호출하여 웹 메서드를 테스트했습니다. 테스트에 성공했습니다.
[dllimport(dllpath,entrypoint = mywebservice.dll, charset = charset.auto, 호출 규칙 = 호출 규칙.stdcall)]
private extern static int addnumber(int a,int b);
...
///테스트 버튼
개인 무효 버튼testwebservice_click(개체 전송자, system.eventargs e)
{
consle.write( addnumber(1,2));
}
7. sql*plus에서 테스트가 실패했습니다. test.txt 파일을 열었을 때 "coinitialize가 아직 호출되지 않았습니다"라는 내용이 나왔습니다. 테스트 코드는 다음과 같습니다.
addtest(1,1)를 실행합니다.
델파이에서 addnumber를 다음과 같이 수정하면
함수 addnumber(a:정수;b:정수):정수;
시작하다
노력하다
result :=a+b;//웹서비스를 호출하지 않고 직접 계산합니다.
제외하고
e: 예외 dogetwebserviceerr(eemessage);
또 다른
결과 :=-1;
끝;
끝;
실행이 성공했습니다.
oracle의 listening.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)
)
)