2011-01-10 4 views
2

D2007 응용 프로그램에서는 THTTPRIO 객체로 액세스되는 Webservice를 사용하고 있습니다. THTTPRIO 개체를 포함하는 TDatamodule이 파괴되면 액세스 위반이 발생합니다.OpToSoapDomComv.TRefCache.FNodes에는 존재하지 않는 XMLNodes에 대한 참조가 포함되어 있습니다.

TSoapDOMConvert가 다시 실행되는 해제 될 때 AV 제기된다

TRefCache(RefMap[0].Instance).Free 

destructor TRefCache.Destroy; 
begin 
    FHREFs.Free; 
    FMHREFs.Free; 
    FNodes := nil; //Causes AV 
end; 

FNodes 호출은 IXMLNodes 하나의 참조를 포함하는 TInterfaceList이지만 객체가 보인다 이 모든 것 전에 풀려났다.

누구든지이 문제를 알고 있습니까? 그것을 해결하는 방법? 리오 개체 THTTPRIO 개체의 사용에

[편집] 더 자세한 정보는 웹 서비스에 대한 다음 호출에서만 사용됩니다

LIResult.Assign((Rio as IWSLicenseIntf).CheckLicense(FLicenseInfo)); 

LIResult 객체는 나중에 해제됩니다.

답변

2

THTTPRIO에는 두 가지 수명 관리 스키마가 있습니다. 하나는 컴포넌트로서 하나는 인터페이스로서. 그것들을 혼합하는 것은 나쁜 생각입니다. 이것은 귀하의 문제 일 수 있습니다.

Jean-Marie Babet이 여기에 댓글을 달았습니다. http://www.delphigroups.info/2/11/344722.html

WSDL에서 생성 된 소스 파일에는 GetIWSLicenseIntf (또는 이와 비슷한 함수)가 있어야합니다. Rio 구성 요소 대신 해당 구성 요소를 사용해보십시오. (Rio as IWSLicenseIntf)GetIWSLicenseIntf()으로 변경하고 필요한 경우 UseWSDL 및 URL 매개 변수를 추가하십시오.

또 다른 옵션은 무료 WSLic 및 무료 RIO를해야하므로 참조 카운트 델파이에서이

var 
    WSLic: IWSLicenseIntf; 
    RIO: THTTPRIO; 
begin 
    RIO := THTTPRIO.Create(nil); 
    RIO.URL := 'www.whatever.com'; 
    WSLic := RIO as IWSLicenseIntf; 
    LIResult.Assign((WSLic).CheckLicense(FLicenseInfo)); 
end; 

인터페이스 같은 것입니다. WSLic이 범위를 벗어나면 그것은 당신을 위해 해제 될 것입니다. 코드가 없으므로 코드를 테스트하지 않습니다.

+0

THTTPRIO 구성 요소를 "THTTPRIO.Create (nil)"및 "FreeAndNil (RIO)"코드를 사용하여 수동으로 생성하려고 시도했지만 여전히 동일한 AV를 얻습니다. RIO 객체의 사용법을 좀 더 자세하게 보여주기 위해 여기에 첫 번째 게시물을 편집했습니다. – Bascy

+0

@Micke - 그의 의견에 대한 답변이 Micke에게만 있습니다. – Bascy

+0

@Bascy 수정 된 답변 –

관련 문제