Получение в коде C++ строки из DLL написанной на Delphi

SQL-Talker
Дата: 10.07.2019 16:15:07
Пытаюсь в C++ получить строку из DLL написанной на Delphi в виде OUT параметра функции
Все бы хорошо, но в полученной строке отсутствуют русские буквы. Вернее даже, получается так что отсекается хвост строки с первого же русского символа.

Код DLL на Delphi
library test_ws;

uses
  Windows, SysUtils, Vcl.Dialogs;

function GetLastErrText_O(out str: WideString): BOOL; stdcall;
begin
  str := 'This is the result of GetLastErrText_O :: zЭто результат работы GetLastErrText_O.:;';
  Result := True;
end;

exports
  GetLastErrText_O;

begin
end.


Код вызова этой функции из C++:
#include <iostream>
#include <windows.h>

using namespace std;

int main()
{
    HMODULE lib = LoadLibrary("test_ws_o.dll");

    typedef BOOL (__stdcall *Func)(BSTR &pstr);
    Func GetLastErrText_O = (Func) GetProcAddress(lib, "GetLastErrText_O");

    BSTR bstr;
    BOOL flg;

    flg = GetLastErrText_O(bstr);
    std::wcout << ".a." << bstr << ".z.";  // ЗДЕСЬ ВЫВОДИТ: ".a.This is the result of GetLastErrText_O :: z"
    std::cout <<"\n";
    SysFreeString(bstr);

    return 0;
}


Если эту же DLL вызвать из программы написанной на Delphi-же, то проблем нет - русские символы не теряются.
Почему при вызове из C++ происходит отсекание?
goldmi45
Дата: 10.07.2019 16:21:29
SQL-Talker,

почему не используете PChar? BSTR как бы для других целей (COM-библиотек)...

ЗЫ: Или я что-то путаю....
SQL-Talker
Дата: 10.07.2019 16:28:08
goldmi45,

PChar = 8 бит
BSTR = WideString = 16 бит
_Vasilisk_
Дата: 10.07.2019 16:28:26
SQL-Talker,

Проблема отображения консоли. Выводите в файл

много текста
SQL-Talker
Дата: 10.07.2019 17:21:34
_Vasilisk_
SQL-Talker,

Проблема отображения консоли. Выводите в файл

А MessageBox не решит эту проблему?
Как BSTR вывести в MessageBox ?
В файл менее удобно...
_Vasilisk_
Дата: 10.07.2019 17:40:37
SQL-Talker
Как BSTR вывести в MessageBox ?
MessageBoxW(0, (LPCWSTR)bstr, NULL, 0)
SQL-Talker
Дата: 10.07.2019 18:11:01
_Vasilisk_,

И опять огромное спасибо ))
ziv-2014
Дата: 10.07.2019 19:27:49
SQL-Talker,
Попробуйте перед wcout поставить что-то типа setlocale(LC_ALL, "Russian_Russia.866");
ziv-2014
Дата: 10.07.2019 19:28:53
SQL-Talker, не используйте out - это бесполезно, лучше использовать var и внутри функции инициализировать переменную.
_Vasilisk_
Дата: 10.07.2019 20:01:14
ziv-2014
Попробуйте перед wcout поставить что-то типа setlocale(LC_ALL, "Russian_Russia.866");
Рекомендуют так писать
_setmode(_fileno(stdout), _O_U16TEXT);