Winapi 为客户端生成远程调用现有服务器函数的RPC代码?

Winapi 为客户端生成远程调用现有服务器函数的RPC代码?,winapi,visual-studio-2015,com,idl,midl,Winapi,Visual Studio 2015,Com,Idl,Midl,在我提出主要问题之前,我有两个基于套接字的现有客户机/服务器win32项目,其中客户机向服务器发送字符串请求,并使用套接字函数(即send()、recv())以字符串形式接收结果 服务器代码的一部分(目前仍基于套接字) 使用上述功能,我将请求的数据发送到客户端 我从服务器发送的数据 问题是:关于如何使用midl编译器将SystemInfo类中的方法表示为可以远程调用的过程,是否有任何指南?我找不到任何关于如何将现有函数与远程过程调用连接的手册(在我的情况下,从客户端使用它们)您将无法将客户端调用

在我提出主要问题之前,我有两个基于套接字的现有客户机/服务器win32项目,其中客户机向服务器发送字符串请求,并使用套接字函数(即send()、recv())以字符串形式接收结果

服务器代码的一部分(目前仍基于套接字)

使用上述功能,我将请求的数据发送到客户端

我从服务器发送的数据


问题是:关于如何使用midl编译器将SystemInfo类中的方法表示为可以远程调用的过程,是否有任何指南?我找不到任何关于如何将现有函数与远程过程调用连接的手册(在我的情况下,从客户端使用它们)

您将无法将客户端调用直接连接到现有的服务器函数。即使在客户端使用隐式绑定句柄,实际的服务器函数也会获得一个绑定句柄(否则服务器将无法处理多个客户端)。正因为如此,签名根本不匹配。

不确定你到底想要什么。是否要使用.IDL对SystemInfo类进行建模?你打算怎么办?和插座有什么关系?你需要COM吗?@Simon Mourier,我需要用RPC方法和调用替换套接字调用。你想从程序中完全删除套接字并改用RPC吗?@Simon Mourier,是的,我澄清了标题。这就是我所质疑的,微软现在在github上提供了IDL和RPC的示例,但请注意这与COM不同。COM依赖于RPC。但是RPC本身就是一种技术。我已经有了一个现有的解决方案,在使用“rpcserveruseprotsekep()、RpcServerRegisterIf2()、RpcServerListen()”之前,我的第二个外部示例项目中包含了一个用于服务器和客户端的文件,文件头上写着“file created by MIDL compiler version 8.00.0603”,允许客户端使用NdrClientCall2()(rpcndr.h)调用服务器端函数。我找不到使用midl编译器的指南/手册,它一定只是一个命令行实用程序,或者我在这里遗漏了什么?我正在为新手(初学者)寻找一些关于midl的信息
struct client_ctx
{
    int socket;
    CHAR buf_recv[MAX_SEND_BUF_SIZE]; // receive buffer
    CHAR buf_send[MAX_SEND_BUF_SIZE]; // send buffer
    unsigned int sz_recv; // size of recv buffer
    unsigned int sz_send_total; // size of send buffer
    unsigned int sz_send; // size of data send
                          // OVERLAPPED structures for notifications of completition 
    OVERLAPPED overlap_recv;
    OVERLAPPED overlap_send;
    OVERLAPPED overlap_cancel;
    DWORD flags_recv; // Flags for WSARecv
};
struct client_ctx g_ctxs[1 + MAX_CLIENTS];

void schedule_write(DWORD idx)
{
    WSABUF buf; buf.buf = g_ctxs[idx].buf_send + g_ctxs[idx].sz_send;
    buf.len = g_ctxs[idx].sz_send_total - g_ctxs[idx].sz_send;
    memset(&g_ctxs[idx].overlap_send, 0, sizeof(OVERLAPPED));
    WSASend(g_ctxs[idx].socket, &buf, 1, NULL, 0, &g_ctxs[idx].overlap_send, NULL);
}
static class SystemInfo{
public :
    static std::string GetOSVersion();
    static std::string GetCurrentTimeStr();
    static std::string GetTimeSinceStartStr();
    static std::string GetFreeMemoryStr();
    static std::string GetFreeSpaceStr();
    static std::string CheckAccess();
    static std::string CheckKeyFileDirectoryAccessRights(wchar_t *char_path, wchar_t *char_buf);
    static std::string UserNameFromSid(PSID userSid);
    static BOOL FileOrDirectoryExists(LPCTSTR szPath);
};