BREW

STRTOWSTR()
などのマクロの定義がアレ

#define STRTOWSTR                   GET_HELPER()->strtowstr

GET_HELPER()の定義は2種類あって

#define GET_HELPER()     g_pvtAEEStdLibEntry
#define GET_HELPER()      (*(((AEEHelperFuncs **)AEEMod_Load) - 1))

だった。


VC++(ver6.0)で /P オプションつけて展開させると

g_pvtAEEStdLibEntry->xxxx(arg);

って感じで展開されてた
ので前者の方を追ってみることにした。


g_pvtAEEStdLibEntryの定義は

extern AEEHelperFuncs *g_pvtAEEStdLibEntry;
typedef struct AEEHelperFuncs AEEHelperFuncs;

struct AEEHelperFuncs
{
   void          *(*memmove)(void *pd, const void *ps, size_t s);
   void          *(*memset)(void *pd, int c, size_t s);

   // Standard String Functions...
   char          *(*strcpy)(char *dst, const char *src);
   char          *(*strcat)(char *dst, const char *src);
   ・・・
   ・・・

という風に関数だけをまとめてある構造体だった
なんでこんな事をする必要があるのでしょうか?

AEEHelperFuncsを初期化しておいてAppliごとに関数の実装を変えるとか?
そういう多態っぽい事をしたい?


GET_HELPER()の上の定義の方を以下のようにコメントアウトしてみると

//#define GET_HELPER()     g_pvtAEEStdLibEntry

下のようにマクロ展開された

      GET_HELPER()->wstrcat(pme->m_szText, szBuf);