我有使用C#和C/C++的经验,但是我从来没有使用过DLL,所以我试图弄清楚它是如何工作的。
我需要集成一个本地dll API接口之间的第三部分软件和我的未来小sw将取代原来的。
来自第三部分的规范是有限的,并描述了一个原型,如:
Error GetInfo([in/out]LPTSTR errorInfo, [in]DWORD errorBufferLength);我用CodeBlocks和MINGW创建了一个dll项目,我现在的目标是接收一个初始反馈,所以在dll文件.cpp中我编写了以下代码:
DLL_EXPORT TCHAR x[5];
Error DLL_EXPORT GetInfo(LPTSTR errorInfo, DWORD errorBufferLength)
{
x = TEXT("test");
errorInfo = x;
errorBufferLength = sizeof(TCHAR*5);
return NO_ERROR;
}在主要方面有:
extern "C" DLL_EXPORT TCHAR x[];
#ifdef __cplusplus
extern "C"
{
#endif
Error DLL_EXPORT GetInfo(LPTSTR errorInfo, DWORD ErrorBufferLength);
}当我查看errorInfo字符串中的第三部分日志时,我发现带有ASCII字符的“损坏”字符串,就像我指向错误的内存位置一样,或者格式不正确。使用原始dll,输出是正确的。我尝试了不同的形式在LPTSTR指针和DWORD分配正确的值,但我确信我遗漏了一些关于这个理论的东西。
你有什么建议吗?抱歉,我的“新手”
发布于 2020-04-20 09:30:00
errorInfo是GetInfo()调用方提供的指针。你不能覆盖它。目前,没有任何东西被复制到调用者的缓冲区中。
因此,您需要使用字符串复制函数之一:
我假设errorBufferLength包含调用方提供的缓冲区的大小。所以你需要把副本限制在它上。
例如:
#include <tchar.h>
#include <Windows.h>
const TCHAR g_const_text[] = _T("Hello World!");
void getString(LP s, size_t bufSize)
{
_tcsncpy_s(s, bufSize, g_const_text, _tcslen(g_const_text));
}
int main()
{
TCHAR t[100];
getString(t, 100);
MessageBox(NULL, t, _T("test"), MB_OK);
return 0;
}https://stackoverflow.com/questions/61318187
复制相似问题