2012-07-27 5 views
4

COM 클라이언트와 C# COM 서버로 관리되지 않는 C++ 응용 프로그램이 있습니다. 이제 COM 서버에서 C++ 함수를 호출 할 수 있기를 바랍니다.C# 대리자로 C++ 함수 포인터를 설정했습니다.

C 번호 :

[ClassInterface(ClassInterfaceType.AutoDual)] 
public class SomeType 
{ 
    [UnmanagedFunctionPointer(CallingConvention.Cdecl)] 
    public delegate void DeleCallBack(string info); 
    public DeleCallBack CallBack; 
    public void SetCallBack(ref IntPtr ptr) 
    { 
     CallBack = (DeleCallBack)Marshal.GetDelegateForFunctionPointer(ptr, typeof(DeleCallBack)); 
    } 
} 

C++ :

HRESULT hr = E_FAIL; 
CComPtr<WindowsFormsApplicationVC9::_SomeType> spTmp; 
hr = spTmp.CoCreateInstance(__uuidof(WindowsFormsApplicationVC9::SomeType)); 
if (SUCCEEDED(hr)) 
{ 
    spTmp->SetCallBack(OnCallBack); 
} 
void OnCallBack(BSTR info) 
{ 
    // c++ function call...; 
} 

나는 그냥 SetCallBack에 OnCallBack 함수 포인터를 전달하는 올바른 방법입니다 확실하지 않다. GetDelegateForFunctionPointer를 호출하는 샘플에서 GetProcessAddress가 함수 포인터 주소를 가져야한다고했지만 다른 함수 이름을 가진 다른 C++ COM 클라이언트가있을 수 있기 때문에이를 수행 할 수 없습니다.

의견이 있으십니까?

+0

프로세스의 경계를 넘어 포인터를 전달하는 것이 이상하게 보였고이를 언급했습니다. 어쩌면 COM 인터페이스에서 C++ 콜백을 래핑하고 C#에 ICallbackInterface 포인터를 전달해야합니까? 여전히 데이터 전달에 문제가 있습니다. 하나의 작은 메모 - 콜백 대리자의 C# 선언에서 문자열에 [MarshalAs (UnmanagedType.BStr)] 특성을 사용해야합니다. –

답변

0

한 가지 방법은 __declspec(dllexport)을 통해 C++ 함수를 노출 한 다음 해당 함수에 P/Invoke를 쓰는 것입니다. 이제 P/Invoke 함수를 델리게이트로 사용할 수 있습니다.

이 코드는 기본적으로 GetProcAddress 접근 방식이지만 C# 컴파일러는 구문 적으로 더 멋지게 만듭니다.

+0

내 이해, dll 내보내기를 사용하여 C#에서 콜백을 호출 할 수있는 유일한 방법은 + +. :( – ArdenZhao

관련 문제