https://git.reactos.org/?p=reactos.git;a=commitdiff;h=a8255233f877e20531f80…
commit a8255233f877e20531f80c5caad1561403142849
Author:     Jérôme Gardou <jerome.gardou(a)reactos.org>
AuthorDate: Thu Apr 29 15:30:59 2021 +0200
Commit:     Jérôme Gardou <zefklop(a)users.noreply.github.com>
CommitDate: Mon May 3 22:00:57 2021 +0200
    [SPEC2DEF] Fix imports of C++ stdcall exports
    Too much mangling mangles it too much
---
 sdk/tools/spec2def/spec2def.c | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)
diff --git a/sdk/tools/spec2def/spec2def.c b/sdk/tools/spec2def/spec2def.c
index 5165af5def9..573e10d67c6 100644
--- a/sdk/tools/spec2def/spec2def.c
+++ b/sdk/tools/spec2def/spec2def.c
@@ -244,10 +244,10 @@ OutputLine_stub(FILE *file, EXPORT *pexp)
     int bRelay = 0;
     int bInPrototype = 0;
-    /* Workaround for forwarded externs. See here for an explanation:
+    /* Workaround for forwarded externs. See here for an explanation:
      * 
https://stackoverflow.com/questions/4060143/forwarding-data-in-a-dll */
-    if (gbMSComp &&
-        (pexp->nCallingConvention == CC_EXTERN) &&
+    if (gbMSComp &&
+        (pexp->nCallingConvention == CC_EXTERN) &&
         (pexp->strTarget.buf != NULL) &&
         (!!ScanToken(pexp->strTarget.buf, '.')))
     {
@@ -576,6 +576,9 @@ PrintName(FILE *fileDest, EXPORT *pexp, PSTRING pstr, int fDeco)
         ((pexp->nCallingConvention == CC_STDCALL) ||
          (pexp->nCallingConvention == CC_FASTCALL)))
     {
+        /* Beware with C++ exports */
+        int is_cpp = pcName[0] == '?';
+
         /* Scan for a dll forwarding dot */
         pcDot = ScanToken(pcName, '.');
         if (pcDot)
@@ -593,8 +596,8 @@ PrintName(FILE *fileDest, EXPORT *pexp, PSTRING pstr, int fDeco)
         pcAt = ScanToken(pcName, '@');
         if (pcAt && (pcAt < (pcName + nNameLength)))
         {
-            /* On GCC, we need to remove the leading stdcall underscore */
-            if (!gbMSComp && (pexp->nCallingConvention == CC_STDCALL))
+            /* On GCC, we need to remove the leading stdcall underscore, but not for C++
exports */
+            if (!gbMSComp && !is_cpp && (pexp->nCallingConvention ==
CC_STDCALL))
             {
                 pcName++;
                 nNameLength--;
@@ -712,8 +715,9 @@ OutputLine_def_GCC(FILE *fileDest, EXPORT *pexp)
         bTracing = 1;
     }
-    /* Special handling for stdcall and fastcall */
+    /* Special handling for stdcall and fastcall, but not C++ exports*/
     if ((giArch == ARCH_X86) &&
+        (pexp->strName.buf[0] != '?') &&
         ((pexp->nCallingConvention == CC_STDCALL) ||
          (pexp->nCallingConvention == CC_FASTCALL)))
     {
@@ -748,9 +752,9 @@ OutputLine_def(FILE *fileDest, EXPORT *pexp)
         DbgPrint("OutputLine_def: skipping private export '%.*s'...\n",
pexp->strName.len, pexp->strName.buf);
         return 1;
     }
-
+
     /* For MS linker, forwarded externs are managed via #pragma
comment(linker,"/export:_data=org.data,DATA") */
-    if (gbMSComp && !gbImportLib && (pexp->nCallingConvention ==
CC_EXTERN) &&
+    if (gbMSComp && !gbImportLib && (pexp->nCallingConvention ==
CC_EXTERN) &&
         (pexp->strTarget.buf != NULL) && !!ScanToken(pexp->strTarget.buf,
'.'))
     {
         DbgPrint("OutputLine_def: skipping forwarded extern export '%.*s'
->'%.*s'...\n",