powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi 10.3.3. - String -> Китаица
30 сообщений из 30, показаны все 2 страниц
Delphi 10.3.3. - String -> Китаица
    #39943224
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня господа !

Имею Delphi 10.3.3. (64-bit)
Создал DLL
- подключил в 64-bit Excel
- передал англицкую строку (даже не кирилица)
- получил в DLL ShowMessage - китайско-шумерскую клинопись (скрин приложен)

Ранее имел
Имею Delphi 7 (32-bit)
Создал DLL
- подключил в 32-bit Excel
- передал любую строку
- получил в DLL ShowMessage - скрепно-родные символы

Подскажите плис где и что необходимо подстроить

Спасибо
...
Рейтинг: 0 / 0
Delphi 10.3.3. - String -> Китаица
    #39943233
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
начать с того, что посмотреть, ЧТО приходит в длл. Не спешить сразу показывать это строкой, а как минимум глянуть в виде байт-массива.
...
Рейтинг: 0 / 0
Delphi 10.3.3. - String -> Китаица
    #39943243
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r
начать с того, что посмотреть, ЧТО приходит в длл. Не спешить сразу показывать это строкой, а как минимум глянуть в виде байт-массива.


Не совсем Вас понял, имеете в виду

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
function TForm1.StrToByte(const Value: String): TByteArr;
var
    I: integer;
begin
    SetLength(Result, Length(Value));
    for I := 0 to Length(Value) - 1 do
        Result[I] := ord(Value[I + 1]) - 48;
end;


Уточните Ваше предложение на примере

Если смотреть строкой, то отправил латиницу СРАЗУ получил "китаицу"

Спасибо
...
Рейтинг: 0 / 0
Delphi 10.3.3. - String -> Китаица
    #39943244
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. как именно описан вызов dll в excel-е?
2. какую строку передает: ansi? unicode?
...
Рейтинг: 0 / 0
Delphi 10.3.3. - String -> Китаица
    #39943253
vkorshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Скорее всего функция неправильно описана. Надо PAnsiChar вместо PChar
...
Рейтинг: 0 / 0
Delphi 10.3.3. - String -> Китаица
    #39943254
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2
1. как именно описан вызов dll в excel-е?
2. какую строку передает: ansi? unicode?


Вот полная сигнатура функций

Описания в VBA Excel

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Private Declare PtrSafe Function Create_AddSpan Lib "Scripts.dll" (ByVal F As String, ByVal L As String, ByVal K As Variant, ByVal B As Variant, ByVal H As Variant, ByRef Q As Variant, ByRef R As Variant) As Integer

Function SetQuery(ParamArray Parameters() As Variant) As String
  Dim F As String, L As String, K As Variant, B As Variant, H As Variant, Q As Variant, R As Variant
  F = ""
  L = Join(Parameters, vbNewLine)
  K = 0
  B = Null
  H = Null
  Q = Null
  R = Null
  I = Create_AddSpan(F, L, K, B, H, Q, R)
End Function



Описания в Delphi DLL
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  function Create_AddSpan(aFile: String; aList: String; aKind: OleVariant; aBars: OleVariant; aHandle: OleVariant; var aSql: OleVariant; var aRecordSet: OleVariant): Integer;
  var
    S: String;
    B: TProgressBar;
    Id: Cardinal;
    H:  THandle;
  begin
    ShowMessage(aList);    -- уже здесь крокозябрит
    Result:=1;
    A:=TAddSpan.Create(iif(Integer(aKind)=0,'[Path]'+vbLine+aList,aFile),B,H,aSql,aRecordSet);
    A.Parameters(aList);
  end;



2. какую строку передает: ansi? unicode?

Полагаю Excel дает Ansi Win-1251
Delphi принимает Unicode

Как это проверить ?
...
Рейтинг: 0 / 0
Delphi 10.3.3. - String -> Китаица
    #39943255
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XКак это проверить ?

В документации прочитать?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Delphi 10.3.3. - String -> Китаица
    #39943262
vkorshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Похоже что параметр должен быть не String а AnsiString
...
Рейтинг: 0 / 0
Delphi 10.3.3. - String -> Китаица
    #39943266
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkorshun,

Нет проблем изменю.. попробую
Крокозябрит ЛАТИНИЦУ, она вложена в процессор, поясните почему
Возможно необходимо донастроить Delphi 10.3.3 (недавно перешел не все знаю )
...
Рейтинг: 0 / 0
Delphi 10.3.3. - String -> Китаица
    #39943271
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XКрокозябрит ЛАТИНИЦУ, она вложена в процессор, поясните почему

https://ru.wikipedia.org/wiki/Юникод
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Delphi 10.3.3. - String -> Китаица
    #39943277
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkorshun
Похоже что параметр должен быть не String а AnsiString


Именно так - Вы абсолютно верны
Спасибо
...
Рейтинг: 0 / 0
Delphi 10.3.3. - String -> Китаица
    #39943279
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

HOME_XКрокозябрит ЛАТИНИЦУ, она вложена в процессор, поясните почему

https://ru.wikipedia.org/wiki/Юникод


Принято изучу - не сталкивался с искажением латиницы ранее
Спасибо
...
Рейтинг: 0 / 0
Delphi 10.3.3. - String -> Китаица
    #39943281
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkorshun
Похоже что параметр должен быть не String а AnsiString

А что, эксель знает про дельфовые ансистринги? Может всё-таки PAnsiChar?
...
Рейтинг: 0 / 0
Delphi 10.3.3. - String -> Китаица
    #39943288
vkorshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вообще плохая идея писать такую DLL. В DLL лучше использовать PChar, PAnsiChar вместо String, AnsiString и в данном примере
наверно не плохо бы было передать Handle основного окна и внутри функции присвоить его Application.Handle. Конечно если ShowMessage реально нужен.
...
Рейтинг: 0 / 0
Delphi 10.3.3. - String -> Китаица
    #39943332
Подключи общий менеджер памяти.
...
Рейтинг: 0 / 0
Delphi 10.3.3. - String -> Китаица
    #39943342
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный,

К экселю? Забористая идея.
...
Рейтинг: 0 / 0
Delphi 10.3.3. - String -> Китаица
    #39943445
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkorshun, alekcvp
А вообще плохая идея писать такую DLL. В DLL лучше использовать PChar, PAnsiChar вместо String, AnsiString и в данном примере
наверно не плохо бы было передать Handle основного окна и внутри функции присвоить его Application.Handle. Конечно если ShowMessage реально нужен.

В целом все работает
Кирилица тоже передается без искажений
ShowMessage - в абсолюте не нужен
(так делаю отладку - а как иначе при запуске с другого приложения, если сталкивались подскажите)

Насчет указателя я не против
Как сопоставить типа
aList: AnsiString = ByVal L As String
aList: PAnsiChar = ?????????

Private Declare PtrSafe Function Create_AddSpan Lib "Scripts.dll" (ByVal F As String, ByVal L As String , ByVal K As Variant, ByVal B As Variant, ByVal H As Variant, ByRef Q As Variant, ByRef R As Variant) As Integer

function Create_AddSpan(aFile: String; aList: AnsiString ; aKind: OleVariant; aBars: OleVariant; aHandle: OleVariant; var aSql: OleVariant; var aRecordSet: OleVariant): Integer;

Спасибо
...
Рейтинг: 0 / 0
Delphi 10.3.3. - String -> Китаица
    #39943450
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Delphi 10.3.3. - String -> Китаица
    #39943991
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X
так делаю отладку - а как иначе при запуске с другого приложения, если сталкивались подскажите
Код: plaintext
1.
Run -> Parameters -> Host Application -> например excel.exe
F9

или в код добавь
Код: pascal
1.
2.
 MessageBox(0,'Подключите отладчик', 'МояДлл',0);
 DebugBreak();

и потом
Код: plaintext
Run -> Attach to Process -> например excel.exe 
...
Рейтинг: 0 / 0
Delphi 10.3.3. - String -> Китаица
    #39943994
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMaster


Да - спасибо за пример

vkorshun,
таки Вы правы заменил на PChar - стало устойчиво работать
Под словом устойчиво понимаю следующий момент
В тело процедуры входит, стрингу показывает нормально, алгоритм выполняется целяком и
достоверно.Результат удовлетворяет.
Но при выходе из процедуры "сваливается"
Пока не заменил тип параметра на PChar

P.S.
До конца пока не отладил - мне необходимо передать длинную строку...> 255 символов
но думаю PChar справиться

Спасибо

P.S.S. это переделка библиотеки с 32-bit на 64-bit
Под 32 bit все работало в представленной выше сигнатуре года 4 ????!!!
...
Рейтинг: 0 / 0
Delphi 10.3.3. - String -> Китаица
    #39943997
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bred eFeM
HOME_X
так делаю отладку - а как иначе при запуске с другого приложения, если сталкивались подскажите
Код: plaintext
1.
Run -> Parameters -> Host Application -> например excel.exe
F9

или в код добавь
Код: pascal
1.
2.
 MessageBox(0,'Подключите отладчик', 'МояДлл',0);
 DebugBreak();

и потом
Код: plaintext
Run -> Attach to Process -> например excel.exe 


Насчет MsgBox - вопрос красен ....

Насчет Run -> Parameters -> Host Application -> например excel.exe

Не все понятно

Последовательность запуска
1.созданная DLL лежит в Path - каталоге
2.на нее из Excel сделана ссылка в виде надстройки (XLA -файла)
- Декларация
Private Declare PtrSafe Function Create_AddSpan Lib "Scripts.dll" (ByVal F As String, ByVal L As String, ByVal K As Variant, ByVal B As
Variant, ByVal H As Variant, ByRef Q As Variant, ByRef R As Variant) As Integer

- Обертка запуска из ячейки Excel
Function SetQuery(ParamArray Parameters() As Variant) As String

3. работа DLL - возвращает Recordset
-- здесь надо включить отладчик и отследить возможность передачи данных из одной платформы VBA
на другую Delphi (это самый скользкий момент)

-- работа внутри DLL - у меня почти всегда стабильна

-- отследить обратный процесс из Delphi типы вернуть в VBA (это второй скользкий момент)

Это можно сделать через отладчик Delphi ?
Уверены ?
Пробывали ?

Спасибо
...
Рейтинг: 0 / 0
Delphi 10.3.3. - String -> Китаица
    #39944013
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X, начал писать ответ, но потом...Полагаю Excel дает Ansi Win-1251
Delphi принимает UnicodeИзучить матчасть. Если совсем лень - пиши WideString.

Как это проверить ?"Attach to Process" не проблема? Тогда бери и смотри - как оно там.

-- работа внутри DLL - у меня почти всегда стабильнаТак почти, всегда или стабильна? ))
...
Рейтинг: 0 / 0
Delphi 10.3.3. - String -> Китаица
    #39944021
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bred eFeM
Изучить матчасть. Если совсем лень - пиши WideString.

По-моему надо писать AnsiString или PAnsiChar - в VBA ansi строки.
...
Рейтинг: 0 / 0
Delphi 10.3.3. - String -> Китаица
    #39944048
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Delphi 10.3.3. - String -> Китаица
    #39944050
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,
...
Рейтинг: 0 / 0
Delphi 10.3.3. - String -> Китаица
    #39944051
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
library Ddll;

function CalcInOut(A:Integer):Integer;  stdcall;
begin
 Result := A - 123;
end;

procedure TextInOut(var vStr: WideString); stdcall;
begin
 vStr := vStr + ' Ok!';
end;
exports
 CalcInOut name 'DllCalc',
 TextInOut name 'DllText';
begin
end.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Declare PtrSafe Function DllCalc Lib "R:\Win64\Debug\Ddll.dll" (ByVal Val As Integer) As Integer '
Declare PtrSafe Function DllText Lib "R:\Win64\Debug\Ddll.dll" (ByVal Ptr As LongPtr) As LongPtr '
'
Sub Macro1()
  Dim Str As String
  Dim Ptr As LongPtr
  Selection = DllCalc(0) '
  Str = Selection.Text
  Ptr = VarPtr(Str)
  DllText (Ptr)          '
  Selection = Str
End Sub

...
Рейтинг: 0 / 0
Delphi 10.3.3. - String -> Китаица
    #39944192
vkorshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для VB может стоит создавать DLL в виде ActiveX/COM ?
...
Рейтинг: 0 / 0
Delphi 10.3.3. - String -> Китаица
    #39944336
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bred eFeM,
Вот в хелпе https://docs.microsoft.com/ru-ru/office/vba/language/reference/user-interface-help/string-data-type
Можно попробовать WideString и PAnsichar - что-то да должно заработать.
...
Рейтинг: 0 / 0
Delphi 10.3.3. - String -> Китаица
    #39946089
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
добавить к дельфийской функции stdcall уже кто-нить предлагал?
...
Рейтинг: 0 / 0
Delphi 10.3.3. - String -> Китаица
    #39946152
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cobalt747,

А что, их там нету? У меня уже галлюцинации в изоляции начались? :)

Код: pascal
1.
2.
3.
4.
procedure TextInOut(var vStr: WideString); stdcall;
begin
 vStr := vStr + ' Ok!';
end;
...
Рейтинг: 0 / 0
30 сообщений из 30, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi 10.3.3. - String -> Китаица
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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