0x00000000 处(位于 DMSPACE1.exe 中)引发的异常: 0xC0000005: 执行位置 0x00000000 时发生访问冲突。
2021/2/3 再次出现这个这个错误,这次工程是UNICODE字符集的,不能使用多字节集解决问题了!
所以,逼着自己找出具体错误点,终于找到:
错误分类是 指针为0。
错误出现的代码是:
#ifdef UNICODE
#define SetDllPath _T(“SetDllPathW”)
#else
#define SetDllPath _T(“SetDllPathA”)
#endif
DWORD dwFun = (DWORD)GetProcAddress(hmod, (LPCSTR)SetDllPath);//【错误行】
//=======================================================
把宏展开,编译不通过,然后在加个括号,这行代码是这样的:
DWORD dwFun = (DWORD)GetProcAddress(hmod, (LPCSTR)(_T(“SetDllPathW”)));
知道这行代码如何改就正确了,但不知道原因,所以去看了这篇文章:
c++ 彻底搞懂 wchar_t WCHAR LPCSTR PCSTR TCHAR
https://blog.csdn.net/weixin_42837024/article/details/106282524
彻底懂了:
因为,参数2 需要的是LPCSTR是指向char类型的字符串的指针,
而 写成这样_T(“SetDllPathW”) 等同于L"SetDllPathW" ,是个宽字节字符串,
所以出错了,导致获取指针失败返回为0,最终出错弹出错误C000005.
应该改为:
DWORD dwFun = (DWORD)GetProcAddress(hmod, (LPCSTR)(“SetDllPathW”));
再简化:
DWORD dwFun = (DWORD)GetProcAddress(hmod, “SetDllPathW”);
上面的宏也是抄的网上的代码用的,现在懂了应该这样写:
#ifdef UNICODE
#define SetDllPath “SetDllPathW”
#else
#define SetDllPath “SetDllPathA”
#endif
DWORD dwFun = (DWORD)GetProcAddress(hmod, SetDllPath);
OK !弄懂字符串知识点,并修改了别人的错误代码,解决了问题,真开心~哈哈!。真的好喜欢编程,好喜欢C++!
联系客服