【发布时间】:2020-05-28 10:01:58
【问题描述】:
我有一个公开函数的 DLL:
extern "C" __declspec( dllimport ) __stdcall int EP_ProtectedStringByKey( char* Key, char* Left, int Len);
C++ 文件头:
typedef int (*GetString)(const char *Key, const char *Str, int Len);
使用此代码,一切正常。程序在“example.txt”中写下它应该写的内容。
GetString _GetSTR;
int longueur;
string my_string;
const char *pmy_string;
HINSTANCE hInstLibrary = LoadLibrary("my.dll");
_GetSTR = (GetString)GetProcAddress(hInstLibrary, "EP_ProtectedStringByKey");
ofstream myfile("example.txt");
longueur = _GetSTR("key_421", NULL, 0);
cout << "Taille : " << longueur << endl;
myfile << "Size : " << longueur << endl;
my_string.resize(longueur); // resizing the string
pmy_string = my_string.c_str(); // Pointer to pmy_string
// ---- _GetSTR("key_421", pmy_string, longueur); ----
myfile << "Another line.\n";
myfile.close();
FreeLibrary(hInstLibrary);
现在如果我添加这行代码:
_GetSTR("key_421", pmy_string, longueur);
我的数据很好地打印在屏幕上:
cout << "Data : " << pmy_string << endl;
但 NOTHING 不再写入文件“example.txt (“另一行”不再写入)。就像在填充 my_string 之后 变量,我的程序拒绝写入文件。但奇怪的是它在屏幕上显示了 pmy_string 的内容。
我想我做错了什么,但我不知道是什么......
感谢您的帮助,
【问题讨论】:
-
您没有初始化
pmy_string以指向正确分配的内存块。 -
对不起,我忘记复制代码中的两行代码了。
-
std::string::c_str返回一个const char*,修改它是未定义的行为,请改用std::string::data,你的GetStringtypedef可能也应该匹配实际的函数定义 -
您需要在
typedef中为函数指针指定__stdcall:typedef int (__stdcall *GetString)(const char *Key, const char *Str, int Len);。没有这个,你会得到堆栈损坏,因为被调用的函数或调用模块是否应该清理堆栈存在冲突(我认为在你的情况下,both 都会尝试) - 然后你进入未定义行为的领域。 -
将 __stdcall 添加到 typedef 就像一个魅力。但我不明白为什么使用 std::string::c_str 是未定义的行为。 std::string::c_str() 给了我指向 char 数组开头的指针?所以我可以毫无问题地写进去,不是吗?谢谢大家,
标签: c++ pointers dll cout ofstream