【问题标题】:My program doesn't want to write in a text file after DLL call我的程序不想在 DLL 调用后写入文本文件
【发布时间】: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,你的GetString typedef 可能也应该匹配实际的函数定义
  • 您需要在typedef 中为函数指针指定__stdcalltypedef 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


【解决方案1】:

为了避免两种未定义的行为,我需要:

  1. 更改 typedef 以精确调用约定

typedef int (*GetString)(const char *Key, const char *Str, int Len);

typedef int (__stdcall *GetString)(const char *Key, const char *Str, int Len);
  1. Dpn't use std::string::c_str() 导致CPP-Reference “写入通过 c_str() 访问的字符数组是未定义的行为。”

pmy_string = my_string.c_str(); // Pointer to pmy_string

pmy_string = my_string.data(); // Pointer to pmy_string

【讨论】:

    猜你喜欢
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多