Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Получение в коде C++ строки из DLL написанной на Delphi  [new]
SQL-Talker
Member

Откуда: Если есть на свете рай, это - ...
Сообщений: 412
Пытаюсь в 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++ происходит отсекание?
10 июл 19, 16:15    [21924274]     Ответить | Цитировать Сообщить модератору
 Re: Получение в коде C++ строки из DLL написанной на Delphi  [new]
goldmi45
Member

Откуда:
Сообщений: 1161
SQL-Talker,

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

ЗЫ: Или я что-то путаю....
10 июл 19, 16:21    [21924284]     Ответить | Цитировать Сообщить модератору
 Re: Получение в коде C++ строки из DLL написанной на Delphi  [new]
SQL-Talker
Member

Откуда: Если есть на свете рай, это - ...
Сообщений: 412
goldmi45,

PChar = 8 бит
BSTR = WideString = 16 бит
10 июл 19, 16:28    [21924292]     Ответить | Цитировать Сообщить модератору
 Re: Получение в коде C++ строки из DLL написанной на Delphi  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10998
SQL-Talker,

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

много текста
10 июл 19, 16:28    [21924293]     Ответить | Цитировать Сообщить модератору
 Re: Получение в коде C++ строки из DLL написанной на Delphi  [new]
SQL-Talker
Member

Откуда: Если есть на свете рай, это - ...
Сообщений: 412
_Vasilisk_
SQL-Talker,

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

А MessageBox не решит эту проблему?
Как BSTR вывести в MessageBox ?
В файл менее удобно...
10 июл 19, 17:21    [21924323]     Ответить | Цитировать Сообщить модератору
 Re: Получение в коде C++ строки из DLL написанной на Delphi  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10998
SQL-Talker
Как BSTR вывести в MessageBox ?
MessageBoxW(0, (LPCWSTR)bstr, NULL, 0)
10 июл 19, 17:40    [21924339]     Ответить | Цитировать Сообщить модератору
 Re: Получение в коде C++ строки из DLL написанной на Delphi  [new]
SQL-Talker
Member

Откуда: Если есть на свете рай, это - ...
Сообщений: 412
_Vasilisk_,

И опять огромное спасибо ))
10 июл 19, 18:11    [21924363]     Ответить | Цитировать Сообщить модератору
 Re: Получение в коде C++ строки из DLL написанной на Delphi  [new]
ziv-2014
Member

Откуда:
Сообщений: 342
SQL-Talker,
Попробуйте перед wcout поставить что-то типа setlocale(LC_ALL, "Russian_Russia.866");
10 июл 19, 19:27    [21924401]     Ответить | Цитировать Сообщить модератору
 Re: Получение в коде C++ строки из DLL написанной на Delphi  [new]
ziv-2014
Member

Откуда:
Сообщений: 342
SQL-Talker, не используйте out - это бесполезно, лучше использовать var и внутри функции инициализировать переменную.
10 июл 19, 19:28    [21924402]     Ответить | Цитировать Сообщить модератору
 Re: Получение в коде C++ строки из DLL написанной на Delphi  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10998
ziv-2014
Попробуйте перед wcout поставить что-то типа setlocale(LC_ALL, "Russian_Russia.866");
Рекомендуют так писать
_setmode(_fileno(stdout), _O_U16TEXT);
10 июл 19, 20:01    [21924412]     Ответить | Цитировать Сообщить модератору
 Re: Получение в коде C++ строки из DLL написанной на Delphi  [new]
SQL-Talker
Member

Откуда: Если есть на свете рай, это - ...
Сообщений: 412
ziv-2014,

Спасибо! А почему var а не out?
10 июл 19, 20:11    [21924416]     Ответить | Цитировать Сообщить модератору
 Re: Получение в коде C++ строки из DLL написанной на Delphi  [new]
ziv-2014
Member

Откуда:
Сообщений: 342
SQL-Talker
ziv-2014,

Спасибо! А почему var а не out?

Потому что out - в делфи глючный. По логике инициализация переменной должна происходить в вызываемой процедуре, но в делфи инициализация переменной происходит в вызывающей процедуре. Соответственно для других языков это будет бесполезен такой синтаксис.
11 июл 19, 14:38    [21924946]     Ответить | Цитировать Сообщить модератору
 Re: Получение в коде C++ строки из DLL написанной на Delphi  [new]
SQL-Talker
Member

Откуда: Если есть на свете рай, это - ...
Сообщений: 412
_Vasilisk_
Рекомендуют так писать
_setmode(_fileno(stdout), _O_U16TEXT);

Не могу заставить это работать
Говорит
'_fileno' was not declared in this scope

Пробовал указать #include <stdio.h> но не помогло
Использую Code::Blocks
12 июл 19, 10:07    [21925480]     Ответить | Цитировать Сообщить модератору
 Re: Получение в коде C++ строки из DLL написанной на Delphi  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10998
SQL-Talker
Пробовал указать #include <stdio.h> но не помогло
Говорят, что этого достаточно
12 июл 19, 16:27    [21925900]     Ответить | Цитировать Сообщить модератору
 Re: Получение в коде C++ строки из DLL написанной на Delphi  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10998
И вот еще
12 июл 19, 16:29    [21925905]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить