2012-08-15 8 views
3

IOfficeAntiVirus COM interface을 사용하여 Microsoft security essentials 바이러스 검색 프로그램을 사용하여 검색을 호출하려고합니다..NET COM interop을 통해 메서드를 호출 할 때 오류가 발생했습니다.

IOfficeAntiVirus 인터페이스가 IUknown에서 상속 받고 IDispatch를 지원하지 않는다고 문서에 나와 있으므로 초기 바인딩을 수행하고 있습니다.

[Guid("56FFCC30-D398-11d0-B2AE-00A0C908FA49"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown) 
] 
public interface IOfficeAntiVirus 
{ 
    void Scan(IntPtr info); 
} 

[ComImport, Guid("2781761E-28E1-4109-99FE-B9D127C57AFE")] 
class SecurityEssentialsAntiVirus 
{ 
} 

스캔 방법에 대한 파라미터는 this example 오는 타입이다. 이 예제는 scan 메소드를 호출하는 대신 .NET 클래스를 사용하여 IOfficeAntiVirus 인터페이스를 구현하기 때문에 원하는 것과 반대입니다. 이 예의 마샬링과 유형은 내가 말할 수있는 한 match the documentation입니다.

var antivirus = (IOfficeAntiVirus)new SecurityEssentialsAntiVirus(); 
var file = new MSOAVINFO(); 
file.pwzFullPath = @"test.txt"; 
IntPtr lParam = Marshal.AllocHGlobal(Marshal.SizeOf(file)); 
Marshal.StructureToPtr(file, lParam, false); 
antivirus.Scan(lParam); 

그것은 검색 방법에 대한 호출에 실패

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] 
public struct MSOAVINFO 
{ 
public int cbsize; 

[MarshalAs(UnmanagedType.U4)] 
public uint uFlags; 
public IntPtr hwnd; 

[MarshalAs(UnmanagedType.LPWStr)] 
public string pwzFullPath; 

[MarshalAs(UnmanagedType.LPWStr)] 
public string pwzHostname; 

[MarshalAs(UnmanagedType.LPWStr)] 
public string pwzOrigURL; 
} 

내가 검색 방법을 호출하는 데 사용할 노력하고있어 코드입니다. 나는 말한다 예외가 얻을 : ". 보호 된 메모리를 읽거나 쓰려고 시도 이것은 종종 다른 메모리가 손상되었음을 표시입니다."

64 비트 시스템의 32 비트 명령 줄 앱에서 실행하고 있습니다. 필자는 32 비트와 64 비트 모두에서 명령 줄 프로그램을 성공적으로 실행하여 실험했습니다.

설명서에서 얻은 정보이므로 IOfficeAntiVirus guid가 정확하다고 확신합니다. 또한 COM 인터페이스가 아닌 임의의 GUID를 시도하면 개체를 인터페이스로 캐스팅하려고하면 오류가 발생합니다.

나는 내가 그 인터페이스에 COM 개체의 다른 유형을 캐스팅하려 할 때 나는 오류를 가지고 있기 때문에 SecurityEssentialsAntiVirus GUID가 IOfficeAntiVirus를 구현 확신합니다.

인터페이스의 Scan 메서드가 올바르게 선언되지 않았을 수 있습니다 (인터페이스의 임의 메서드를 선언해도 같은 오류가 발생 함). 보안 기본 어셈블리에 대한 문서 작업을하지 않기 때문에 상상할 수있는 방식으로 인터페이스를 구현하지 못할 수도 있습니다. 누구든지 그걸 확인하는 방법을 알고 있습니까?

해당 디렉토리에서 MpOAv.dll 파일을 볼 수 있습니다.이 파일은 IOfficeAntiVirus 설명서의 헤더 파일과 동일한 이름입니다. ole-com 객체 뷰어에서 그 dll을 열어서 안에 무엇이 있는지 볼 수 없습니다. 내가 말하는 메시지가 :

IMoniker :: BindToObject가에서 만든 파일 모니 커에 실패 ( "C : \ 프로그램 파일 \ Microsoft 보안 클라이언트 \ MpOAv.dll"). 파일

MK_E_INVALIDEXTENSION에 대한 나쁜 확장 ($ 800401E6)

그것은 또한 내가 검색 방법에 올바르게 구조체를 통과 아니에요 수 있습니다. AllocCoTaskMem()을 사용하고 참조에 의해 구조체를 전달하는 것을 포함하여 행운없이 수백 가지 변형을 시도했습니다.

나는 interop을하는 데 많은 경험이 없다. (오늘 이것을 알아 내려고 노력했다.) 그래서 나는 올바른 방향으로 밀고가는 것을 정말로 고맙게 생각합니다. :)

답변

0

같은 문제가 있지만 아무 결과도없이 며칠을 보냈습니다. 내가 할 수 있었던 최대치는 오류없이 검사를 실행하지만 악성 코드의 경우에도 OK 상태를 반환합니다. 내 경우에

그래서 연구를 계속하고 Mozilla은 검사를 위해 IAttachmentExecute 바이러스 백신 API를 사용합니다. 그리고 저장 방법, 그것의, 저장하기 전에 파일의 유효성을 검사 바이러스 스캐너 또는 다른 신뢰 서비스를 실행할 수 있습니다

IAttachmentExecute :: 저장 IOfficeAntiVirus

의 스캔처럼 같은 일을하고. 이러한 서비스는 파일을 삭제하거나 변경할 수 있습니다. 제안에 대한 codeples에 그것의

및 구현 http://antivirusscanner.codeplex.com/

+0

당신이 그것을 알아 낸 것을 기쁘게 생각합니다! 내 삶의 5 일이 돌아 오지 않을거야. :) – Helephant

0

내가주의하는 한 가지는 cbsize를 설정하지 않았다는 것입니다. file.cbsize = Marshal.SizeOf (file);

+0

감사합니다. 나는 그것을 시도했지만 그것이 효과를 냈다. – Helephant

관련 문제