Моя программа не хочет писать в текстовый файл после вызова DLL - PullRequest
0 голосов
/ 28 мая 2020

У меня есть 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;

Но НИЧЕГО больше не записывается в файл « example.txt (« Другая строка »не записывается больше). Это похоже на то, что после заполнения переменной my_string моя программа отказалась записывать в файл. Но, как ни странно, на экране отображается содержимое pmy_string .

I предположим, я делаю что-то не так, но не могу понять, что ...

Спасибо за помощь,

1 Ответ

0 голосов
/ 28 мая 2020

Чтобы избежать двух неопределенных действий, мне нужно:

  1. Изменить typedef, чтобы уточнить соглашение о вызовах

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

In

typedef int (__stdcall *GetString)(const char *Key, const char *Str, int Len);
Dp not use std :: string :: c_str () причина в CPP -Reference "Запись в массив символов, доступ к которому осуществляется через c_str (), неопределенное поведение. "

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

In

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