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