powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Получение в коде C++ строки из DLL написанной на Delphi
15 сообщений из 15, страница 1 из 1
Получение в коде C++ строки из DLL написанной на Delphi
    #39836014
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пытаюсь в C++ получить строку из DLL написанной на Delphi в виде OUT параметра функции
Все бы хорошо, но в полученной строке отсутствуют русские буквы. Вернее даже, получается так что отсекается хвост строки с первого же русского символа.

Код DLL на Delphi
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
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++:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
#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++ происходит отсекание?
...
Рейтинг: 0 / 0
Получение в коде C++ строки из DLL написанной на Delphi
    #39836020
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL-Talker,

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

ЗЫ: Или я что-то путаю....
...
Рейтинг: 0 / 0
Получение в коде C++ строки из DLL написанной на Delphi
    #39836025
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45,

PChar = 8 бит
BSTR = WideString = 16 бит
...
Рейтинг: 0 / 0
Получение в коде C++ строки из DLL написанной на Delphi
    #39836026
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL-Talker,

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

много текста
...
Рейтинг: 0 / 0
Получение в коде C++ строки из DLL написанной на Delphi
    #39836042
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_SQL-Talker,

Проблема отображения консоли. Выводите в файл
А MessageBox не решит эту проблему?
Как BSTR вывести в MessageBox ?
В файл менее удобно...
...
Рейтинг: 0 / 0
Получение в коде C++ строки из DLL написанной на Delphi
    #39836052
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL-TalkerКак BSTR вывести в MessageBox ?
Код: plaintext
1.
MessageBoxW(0, (LPCWSTR)bstr, NULL, 0)
...
Рейтинг: 0 / 0
Получение в коде C++ строки из DLL написанной на Delphi
    #39836066
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

И опять огромное спасибо ))
...
Рейтинг: 0 / 0
Получение в коде C++ строки из DLL написанной на Delphi
    #39836088
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL-Talker,
Попробуйте перед wcout поставить что-то типа setlocale(LC_ALL, "Russian_Russia.866");
...
Рейтинг: 0 / 0
Получение в коде C++ строки из DLL написанной на Delphi
    #39836089
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL-Talker, не используйте out - это бесполезно, лучше использовать var и внутри функции инициализировать переменную.
...
Рейтинг: 0 / 0
Получение в коде C++ строки из DLL написанной на Delphi
    #39836095
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014Попробуйте перед wcout поставить что-то типа setlocale(LC_ALL, "Russian_Russia.866");Рекомендуют так писать
Код: plaintext
1.
_setmode(_fileno(stdout), _O_U16TEXT);
...
Рейтинг: 0 / 0
Получение в коде C++ строки из DLL написанной на Delphi
    #39836097
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014,

Спасибо! А почему var а не out?
...
Рейтинг: 0 / 0
Получение в коде C++ строки из DLL написанной на Delphi
    #39836397
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL-Talkerziv-2014,

Спасибо! А почему var а не out?
Потому что out - в делфи глючный. По логике инициализация переменной должна происходить в вызываемой процедуре, но в делфи инициализация переменной происходит в вызывающей процедуре. Соответственно для других языков это будет бесполезен такой синтаксис.
...
Рейтинг: 0 / 0
Получение в коде C++ строки из DLL написанной на Delphi
    #39836681
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Рекомендуют так писать
Код: plaintext
1.
_setmode(_fileno(stdout), _O_U16TEXT);


Не могу заставить это работать
Говорит
'_fileno' was not declared in this scope
Пробовал указать #include <stdio.h> но не помогло
Использую Code::Blocks
...
Рейтинг: 0 / 0
Получение в коде C++ строки из DLL написанной на Delphi
    #39836925
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL-TalkerПробовал указать #include <stdio.h> но не помогло Говорят , что этого достаточно
...
Рейтинг: 0 / 0
Получение в коде C++ строки из DLL написанной на Delphi
    #39836929
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вот еще
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Получение в коде C++ строки из DLL написанной на Delphi
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]