2012-01-15 2 views
1

TcpSocketServer는 C#으로 작성되었으며 CLI없이 기본 C++에서 사용하려고합니다. 클래스는 클라이언트 연결/연결 해제 및 데이터 수신시 이벤트를 발생시킵니다. 지금까지 서버를 작동시키고 연결을 허용했지만 데이터를 보내거나받을 수는 없습니다.COM + Interop을 사용하여 C++ 비 관리 코드에서 C# 이벤트 처리

이 클래스는 내가 필요로하는 몇 가지 클래스 중 하나이기 때문에 원시 C++ 소켓을 사용하도록 제안하지 마십시오.

(관련) C# 코드가 우는 소리입니다 : 이제

[ComVisible(true)] 
public delegate void TcpClientConnectedEventHandler(Socket s); 

[ComVisible(true)] 
public delegate void TcpClientDisconnectedEventHandler(EndPoint ep); 

[ComVisible(true)] 
public delegate void TcpDataReceivedEventHandler(TcpPacket p); 

[ComVisible(true)] 
[Guid("7cf49dcd-c11b-4e94-9f73-d5a24fe027c3")] 
public interface ISocketTcpServer 
{ 
    event TcpClientConnectedEventHandler ClientConnected; 
    event TcpClientDisconnectedEventHandler ClientDisconnected; 
    event TcpDataReceivedEventHandler DataReceived; 

    [ComVisible(true)] 
    int SendToAll(byte[] buffer); 
} 

, C에서 + + I 다음 (관련) 코드가 있습니다

// Function Prototypes 
void onClientConnected(); 
void onClientDisconnected(); 
void onDataReceived(ITcpPacket *packet); 
VARIANT_BOOL started(ISocketTcpServer *server); 
long send(ISocketTcpServer *server, char *s); 

int main(int argc, char* argv[]) 
{ 
    ISocketTcpServer *server = NULL; 
    _TcpDataReceivedEventHandler *dataReceivedPtr = NULL; 
    _TcpClientConnectedEventHandler *clientConnectedPtr = NULL; 
    _TcpClientDisconnectedEventHandler *clientDisconnectedPtr = NULL; 
    char sInput[1024]; 

    std::cout << "C# Sockets Interop example.\r\n"; 

    // Initialize COM. 
    CoInitialize(NULL); 

    // Create the interface pointers. 
    HRESULT hr = CoCreateInstance(__uuidof(SocketTcpServer), NULL, 
     CLSCTX_INPROC_SERVER, __uuidof(ISocketTcpServer), (void **)&server); 

    if((hr != S_OK) || (server == NULL)) 
    { 
     std::cout << "Create instance failed\r\n"; 
     CoUninitialize(); 
     return 0; 
    } 

    // Configure TCP Server 
    server->put_Port(2000); 
    dataReceivedPtr = (_TcpDataReceivedEventHandler *)&onDataReceived; 
    clientConnectedPtr = (_TcpClientConnectedEventHandler *)&onClientConnected; 
    clientDisconnectedPtr = 
     (_TcpClientDisconnectedEventHandler *)&onClientDisconnected; 

    /* HERE IS WHERE I SET UP THE EVENTS */ 
    server->add_ClientConnected(clientConnectedPtr); 
    server->add_ClientDisconnected(clientDisconnectedPtr); 
    server->add_DataReceived(dataReceivedPtr); 

    // Start TCP Server 
    std::cout << "Starting TCP Server on port 2000.\r\n"; 
    server->Start(); 
    while(!started(server)) Sleep(100); 
    while(started(server)) 
    { 
     std::cin >> sInput; 
     send(server, sInput); 
    } 

    // Uninitialize COM. 
    CoUninitialize(); 
    return 0; 
} 

long send(ISocketTcpServer *server, char *s) 
{ 
    long result = 0; 
    server->SendToAll((SAFEARRAY *) s, &result); 
    return result; 
} 

모든 다른 기능 정의를 가지고 잘 작동을, 그래서 나는 그들을 포함하지 않았다.

중요한 질문은 다음과 같습니다. 이벤트를 처리하기 위해 이벤트를 처리 할 함수를 어떻게 선언해야합니까? 나는 그들이 관련된 Delegate와 일치하지 않기 때문에 작동하지 않는다. 그러나 .NET Framework의 Socket과 EndPoint 클래스에는 액세스 할 수 없다.

또한있어서

SendToAll(byte[] buffer):int 

함수

SendToAll(SAFEARRAY *buffer, long *pRetVal):HRESULT 

매핑하지만이 주조 문제가 될 수있다.

나에게 줄 수있는 도움이나 조언이 유용 ​​할 것입니다.

미리 뱅크스.

답변

0

VC++에서 표준 COM 구성 요소의 이벤트를 처리하는 방법을 알고 있다고 가정하고 (저는 C++ 개발자가 아니므로 그 부분을 도울 수 없습니다), C#을 만드는 것이 가장 좋습니다. ComSourceInterfacesAttribute을 사용하는 표준 COM 구성 요소 인 것처럼 보입니다. MSDN은 이렇게하기 위해 단순한 How To을 가지고 있습니다.

이 (어셈블리가 함께 표시된 경우가 불필요하기 때문에 나는 [ComVisible(true)] 속성을 제거, 주) 뭔가를 찾고 종료됩니다 귀하의 C# 코드 :

public delegate void TcpClientConnectedEventHandler(Socket s); 
public delegate void TcpClientDisconnectedEventHandler(EndPoint ep); 
public delegate void TcpDataReceivedEventHandler(TcpPacket p); 

public interface ISocketTcpServerEvents 
{ 
    void ClientConnected; 
    void ClientDisconnected; 
    void DataReceived; 
} 

[ComSourceInterfaces(typeof(ISocketTcpServerEvents))] 
public class SocketTcpServer 
{ 
    public event TcpClientConnectedEventHandler ClientConnected; 
    public event TcpClientDisconnectedEventHandler ClientDisconnected; 
    public event TcpDataReceivedEventHandler DataReceived; 

    int SendToAll(byte[] buffer); 
} 
관련 문제