编译使用 Windows MS/VS 上的 node-gyp 调用约定的代码



预先声明,我不是Windows程序员。

我正在尝试开发一个 Node 扩展,它在 macOS 上运行良好,但在 Windows 上我需要包含一个具有此定义的标头:

typedef DWORD WINAPI (*CM_Open_DevNode_Key)(DWORD, DWORD, DWORD, DWORD, ::PHKEY, DWORD);

我知道WINAPI__stdcall#define,这是win32上的调用约定。

该行无法使用 MSVS 2017 编译:winportfactory.h(54): error C2059: syntax error: '(',因为__stdcall

我想我已经为 win32 设置了 MSVS。我打电话给npm config set arch ia32,我的binding.gyp看起来像这样:

"defines": [
  "__WIN32__"  # Needed to include the right subheader
],
"msvs_configuration_platform": "win32",
"msvs_settings": {
  "VCCLCompilerTool": {
    "AdditionalOptions": [
      "/EHsc",
      "/std:c++17"
    ]
  }
}

以下是完整的编译器调用:

  C:Program Files (x86)Microsoft Visual Studio2017BuildToolsVCToolsMSVC14.16.27023binHostX64x86CL.exe /c /I"C:Usersdanni.node-gyp10.15.1includenode" /I"C:Use
  rsdanni.node-gyp10.15.1src" /I"C:Usersdanni.node-gyp10.15.1depsopensslconfig" /I"C:Usersdanni.node-gyp10.15.1depsopensslopensslinclude" /I"C:Usersdanni.
  node-gyp10.15.1depsuvinclude" /I"C:Usersdanni.node-gyp10.15.1depszlib" /I"C:Usersdanni.node-gyp10.15.1depsv8include" /I..src /I..externbossasrc /I..node
  _modulesnan /I..srccompat /Z7 /nologo /W3 /WX- /diagnostics:classic /MP /Ox /Ob2 /Oi /Ot /Oy /GL /D NODE_GYP_MODULE_NAME=bossa /D USING_UV_SHARED=1 /D USING_V8_SHARED=1 /D
   V8_DEPRECATION_WARNINGS=1 /D WIN32 /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _HAS_EXCEPTIONS=0 /D VERSION=bossajs /D __WIN32__ /D BUILDING_NODE_EXTENSION /
  D _WINDLL /GF /Gm- /MT /GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR- /Fo"Releaseobjbossa\" /Fd"Releaseobjbossavc141.pdb" /Gd /TP /wd4351 /wd4355 /wd4800
  /wd4251 /wd4275 /wd4244 /wd4267 /analyze- /FC /errorReport:queue /EHsc /std:c++17 ..srcindex.cc ..srcbossajs.cc ..srcobserver.cc ..srcconnectworker.cc MORE_FILES "C:Program Filesnodejsnode_modulesnpmnode_modulesnode-gypsrcwin_delay_load_hook.cc"
  index.cc

我哪里出错了?

我发现它失败的原因不是因为它们被关闭或某些配置问题,而是因为 MSVC 不同意令牌的顺序。

它需要:

typedef DWORD (WINAPI *CM_Open_DevNode_Key)(DWORD, DWORD, DWORD, DWORD, ::PHKEY, DWORD);

这个答案有更多细节。

最新更新