C++ memcpy在DLL中使用并加载到另一个应用程序中,但内存本身正在改变,我是否做错了什么?

C++ memcpy在DLL中使用并加载到另一个应用程序中,但内存本身正在改变,我是否做错了什么?,c++,memory,dll,memcpy,C++,Memory,Dll,Memcpy,此问题已解决,感谢您指出typedef声明中的错误。 我在其中错过了一切。在挖掘了一些材料之后,它是关于调用约定的,不知何故它以不同的方式处理堆栈。我不是很确定,但它似乎解决了这个问题。谢谢 大家好,大家好,, 我目前正在开发一个DLL,它提供串行端口通信,然后将结果写入缓冲区。 假设DLL函数部分是DLL, 应用程序部分为EXE 经过一定的过程后,我将能够在DLL函数中创建一个字符串。 然后我使用memcpy将DLL中的缓冲区复制到EXE提供的char*指针 但是,有时复制所有字节是可以的,

此问题已解决,感谢您指出typedef声明中的错误。 我在其中错过了一切。在挖掘了一些材料之后,它是关于调用约定的,不知何故它以不同的方式处理堆栈。我不是很确定,但它似乎解决了这个问题。谢谢

大家好,大家好,, 我目前正在开发一个DLL,它提供串行端口通信,然后将结果写入缓冲区。 假设DLL函数部分是DLL, 应用程序部分为EXE

经过一定的过程后,我将能够在DLL函数中创建一个字符串。 然后我使用memcpy将DLL中的缓冲区复制到EXE提供的char*指针

但是,有时复制所有字节是可以的, EXE可以转储与DLL写入的结果相同的结果, 但有时它在DLL函数部分显示了正确的值, 但在EXE中,内存部分变得杂乱无章

我想知道我是否遗漏了一些明显的部分,因为我在内存方面没有真正的经验,外部模块是如何使用它的

我现在将发布DLL部分和EXE部分代码供您参考

DLL部分:在VC++2012中编译 dumpstr:从给定地址转储前20个字节。 **mp_get_var通过.def文件导出并导出到DLL**

void dumpstr(char* charC, char* desc) {
     printf("\n= S T A R T ===\nDLL Dumping the %s Array...\n", desc);
     int i;
    for(i=0; i<20; i++) {
             printf("%p:%3d | ", charC+i, *(charC+i));
             if((i+1)%4==0) printf("\n");
             }
    printf("\n==E N D====\n");
     }
int _stdcall mp_get_var(char* inSI, char* cParam, int paramIndex, char *outSI) {
    //std::string returnValue = MyConvert::get_fieldvalue2(inSI,cParam, paramIndex);
    printf("ON DLL START, INSI ADDR (%p)\n", inSI);
    printf("ON DLL START, OUTSI ADDR (%p)\n", outSI);
    dumpstr(outSI, "PREV OUTSI");
    //printf("DLL received: %s\n", inSI);
    //dumpstr(inSI, "THIS > INSI");
    std::string returnValue = "EPTATROPICAL";
    memcpy(outSI,returnValue.c_str(),returnValue.length());  

    //*(outSI + returnValue.length()) = '\0';
    //printf("DLL copied outSI: %s\n", outSI);
    dumpstr(outSI, "THIS COPIED OUTSI");
    printf("ON DLL END, INSI ADDR (%p)\n", inSI);
    printf("ON DLL END, OUTSI ADDR (%p)\n", outSI);
    return returnValue.length();
}
但是,以下是屏幕转储: 第一次通话

ON DLL START, INSI ADDR (0028F8B0)
ON DLL START, OUTSI ADDR (0028F680)

= S T A R T ===
DLL Dumping the PREV OUTSI Array...
0028F680:  0 | 0028F681:  0 | 0028F682:  0 | 0028F683:  0 |
0028F684:  0 | 0028F685:  0 | 0028F686:  0 | 0028F687:  0 |
0028F688:  0 | 0028F689:  0 | 0028F68A:  0 | 0028F68B:  0 |
0028F68C:  0 | 0028F68D:  0 | 0028F68E:  0 | 0028F68F:  0 |
0028F690:  0 | 0028F691:  0 | 0028F692:  0 | 0028F693:  0 |

==E N D====

= S T A R T ===
DLL Dumping the THIS COPIED OUTSI Array...
0028F680: 69 | 0028F681: 80 | 0028F682: 84 | 0028F683: 65 |
0028F684: 84 | 0028F685: 82 | 0028F686: 79 | 0028F687: 80 |
0028F688: 73 | 0028F689: 67 | 0028F68A: 65 | 0028F68B: 76 |
0028F68C:  0 | 0028F68D:  0 | 0028F68E:  0 | 0028F68F:  0 |
0028F690:  0 | 0028F691:  0 | 0028F692:  0 | 0028F693:  0 |

==E N D====
ON DLL END, INSI ADDR (0028F8B0)
ON DLL END, OUTSI ADDR (0028F680)
ON EXE, OUTSI address : 0028F680佩 return length: 12
第一次调用的DLL端已结束 这是同一地址的EXE转储部分。

----
Now Dumping the Char Array...
0028F680: 69 | 0028F681: 80 | 0028F682: 84 | 0028F683: 65 |
0028F684: 84 | 0028F685: 82 | 0028F686: 79 | 0028F687: 80 |
0028F688: 73 | 0028F689: 67 | 0028F68A: 65 | 0028F68B: 76 |
0028F68C:  0 | 0028F68D:  0 | 0028F68E:  0 | 0028F68F:  0 |
0028F690:  0 | 0028F691:  0 | 0028F692:  0 | 0028F693:  0 |
在EXE部件中转储finish,您可以看到它与DLL部件转储相同,因此我假设它工作正常。

----
Now Dumping the Char Array...
0028F680: 69 | 0028F681: 80 | 0028F682: 84 | 0028F683: 65 |
0028F684: 84 | 0028F685: 82 | 0028F686: 79 | 0028F687: 80 |
0028F688: 73 | 0028F689: 67 | 0028F68A: 65 | 0028F68B: 76 |
0028F68C:  0 | 0028F68D:  0 | 0028F68E:  0 | 0028F68F:  0 |
0028F690:  0 | 0028F691:  0 | 0028F692:  0 | 0028F693:  0 |
接下来是下一个调用,它使用Result3作为缓冲区。我看到它的地址来自0028F450

----
Now Dumping the Char Array...
0028F450:  0 | 0028F451:  0 | 0028F452: 68 | 0028F453:  0 |
0028F454: 83 | 0028F455:-12 | 0028F456: 40 | 0028F457:  0 |
0028F458:  0 | 0028F459:  0 | 0028F45A:  0 | 0028F45B:  0 |
0028F45C:  0 | 0028F45D:  0 | 0028F45E:  0 | 0028F45F:  0 |
0028F460:  0 | 0028F461:  0 | 0028F462:  0 | 0028F463:  0 |
奇怪从这里开始,我在0028F450的DLL中看到,它应该是

69,80,84,65,84,82,79,80,73,67,65,76
然而。。。exe中的转储会变成这样, 但它变成了

0,0,68,0,83,-12,40,0,0,0,0,0
转储仍位于地址0028F450

----
Now Dumping the Char Array...
0028F450:  0 | 0028F451:  0 | 0028F452: 68 | 0028F453:  0 |
0028F454: 83 | 0028F455:-12 | 0028F456: 40 | 0028F457:  0 |
0028F458:  0 | 0028F459:  0 | 0028F45A:  0 | 0028F45B:  0 |
0028F45C:  0 | 0028F45D:  0 | 0028F45E:  0 | 0028F45F:  0 |
0028F460:  0 | 0028F461:  0 | 0028F462:  0 | 0028F463:  0 |
仅供参考,这里是第三次调用,再次使用Result2作为缓冲区: 然而,这并没有被神秘地变成胡言乱语

ON DLL START, INSI ADDR (0028F8B0)
ON DLL START, OUTSI ADDR (0028F680)

= S T A R T ===
DLL Dumping the PREV OUTSI Array...
0028F680: 69 | 0028F681: 80 | 0028F682: 84 | 0028F683: 65 |
0028F684: 84 | 0028F685: 82 | 0028F686: 79 | 0028F687: 80 |
0028F688: 73 | 0028F689: 67 | 0028F68A: 65 | 0028F68B: 76 |
0028F68C:  0 | 0028F68D:  0 | 0028F68E:  0 | 0028F68F:  0 |
0028F690:  0 | 0028F691:  0 | 0028F692:  0 | 0028F693:  0 |

==E N D====

= S T A R T ===
DLL Dumping the THIS COPIED OUTSI Array...
0028F680: 69 | 0028F681: 80 | 0028F682: 84 | 0028F683: 65 |
0028F684: 84 | 0028F685: 82 | 0028F686: 79 | 0028F687: 80 |
0028F688: 73 | 0028F689: 67 | 0028F68A: 65 | 0028F68B: 76 |
0028F68C:  0 | 0028F68D:  0 | 0028F68E:  0 | 0028F68F:  0 |
0028F690:  0 | 0028F691:  0 | 0028F692:  0 | 0028F693:  0 |

==E N D====
ON DLL END, INSI ADDR (0028F8B0)
ON DLL END, OUTSI ADDR (0028F680)
TERMINALID return length: 12

----
Now Dumping the Char Array...
0028F680: 69 | 0028F681: 80 | 0028F682: 84 | 0028F683: 65 |
0028F684: 84 | 0028F685: 82 | 0028F686: 79 | 0028F687: 80 |
0028F688: 73 | 0028F689: 67 | 0028F68A: 65 | 0028F68B: 76 |
0028F68C:  0 | 0028F68D:  0 | 0028F68E:  0 | 0028F68F:  0 |
0028F690:  0 | 0028F691:  0 | 0028F692:  0 | 0028F693:  0 |
我现在很困惑,浪费了整整一天的时间,任何进一步的指导都非常感谢:)
如果我需要提供更多信息,我很乐意提供,谢谢您的帮助。

我还没有验证这一点,但您可能希望确保函数指针的调用约定已正确编码。也就是说,您的typedef似乎缺少
\u stdcall
。无论如何,值得一试。谢谢你,WhozCraig,似乎它解决了这个问题。太好了。很高兴这有帮助。