0

现在我有一个客户端,它向我的服务器发送一个它想要数据的命令列表。我的服务器使用 getProcAddress 通过 DLL 加载这些命令,例如:

InitializeDLL initializeDLL = (InitializeDLL)GetProcAddress(hInstanceLibrary, "InitializeDLL");

其中 initializeDLL 定义为:

typedef int (CALLBACK* InitializeDLL)(int,int);

客户端现在将命令名称作为它想要数据的字符串发送。我有很多我希望能够使用的命令列表,但我不知道如何以有效的方式实现它。我正在考虑创建一个 Map 并将名称的字符串用作键,然后将 CALLBACK* 用于适当的函数作为指针。但后来我也必须在之后施放它。我主要是一名 Java 程序员,而不是最好的 C++ 程序员,所以我不确定这个 Map 想法是否会奏效,或者最后如何处理演员表。另外,我查看了 Wikipedia 上的命令模式,但不知道在这种情况下如何实现。

4

1 回答 1

0

地图应该可以做到这一点。将每个字符串映射到函数指针的映射,该函数指针将在收到特定消息时执行。如果你想使用命令模式,那么你可以有类似的东西:Disclamer,我很久没有写过 C++ 代码了,这段代码可能无法编译):

abstract class Command{
  private:
     string commandName;
     CALLBACK* callBackFunction
  public:
     Command(string name, CALLBACK* function){
        commandName = name;
        callBackFunction = function;
     }
     // Here, you can check your current environment
     // to see if you can execute this command in the current
     // configuration and system state
     bool CanExecute() = 0;

     // This method does the call to the callback
     void Execute(){
          // call the callback function here
     }
}

这种模式是命令模式和工厂方法模式的混合。Command为每个可能的条目定义从抽象类继承的命令。现在,您可以使用带有命令的字符串映射,而不是使用带有函数指针的字符串映射。当你得到一个字符串时,CanExecute首先调用你的命令,看看命令是否可以在当前状态下执行。调用Execute以运行调用回调函数的命令。这是我能想到的封装命令、它们的执行前提条件和它们要执行的实际代码的最佳方式。

附带说明一下,这种模式现在广泛用于 .NET (WPF)

于 2012-06-20T19:26:23.530 回答