powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / SendMessage (WM_COPYDATA, String) Приемник - ANSI, Передатчик - Unicode (.Net)
4 сообщений из 4, страница 1 из 1
SendMessage (WM_COPYDATA, String) Приемник - ANSI, Передатчик - Unicode (.Net)
    #38423641
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приемник, VB6:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
  Select Case Msg
    Case WM_COPYDATA
      Dim cds As COPYDATASTRUCT
      Dim the_str As String
...
      Call CopyMemory(cds, ByVal lParam, Len(cds))
...
        the_str = PtrToString_len(cds.lpData, cds.cbData)

'---------
Public Function PtrToString_len(Ptr As Long, lenth As Long) As String
  Dim Data() As Byte
  Dim str As String
  Dim i As Integer
  str = ""
  ReDim Data(0 To lenth - 1) 'крайний байт нулевой -можно проигнорировать
  If Ptr <> 0 Then
    CopyMemory Data(0), ByVal Ptr, lenth
    For i = 0 To lenth - 1
      If Data(i) = 0 Then Exit For
      str = str & Chr(Data(i))
    Next i
  End If
  PtrToString_len = str
End Function



Передатчик, .NET
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    If hwndTarget <> IntPtr.Zero Then
      Dim cds As New COPYDATASTRUCT

      cds.dwData = CType(12, IntPtr) 'идентифицирует тип команды
      cds.cbData = str_data.Length * Marshal.SystemDefaultCharSize 'Len(str_data) + 1
      cds.lpData = Marshal.StringToCoTaskMemAuto(str_data) 'cds.lpData = VarPtr(StringToMas(str_data).ByteStr(0))
      
      Call SendMessage_COPYDATASTRUCT(hwndTarget, WM_COPYDATA, Form1.Handle, cds)
      Marshal.FreeCoTaskMem(cds.lpData)
    End If



.NET -код только родил, вроде претендует на правильность.
Но эта пара нерабочая.

Причину - в общем могу объяснить.
VB6 ждет на входе указатель на ANSI-строку с терминирующим '\0' на конце.
cds.lpData -указатель на начало строки, cds.cbData -длина строки(массива байтов).

Я 100% уверен что .NET код отправляет указатель на Юникод-строку.

Были б оба приложения .NET-юникод, думаю было б без проблем.

Т.е. вопрос: как мне запихнуть в указатель cds.lpData на стороне .NET ANSI-строку?
Как ее в .NET сделать (из дефолтной юникодовой As String)?
Юникод надо странсформировать в ANSI согласно текущей кодировке системы (Панель управления -> Язык и региональные стандарты -> Дополнительно), т.е. если там стоит "Русский", то и ANSI-кодировка должна быть "Русский".


Оговорка: VB6 код приемника переделывать на данном этапе не буду.

Я конечно за Юникод (в перспективе).
Но сейчас типа нужна заглушка.

И не только заглушка. У меня есть еще C++ компонент, кот. посылаются WM_COPYDATA,
перевод этого компонента в .NET/Unicode не планирую,
т.е. мне надо знать как послать НЕюникод строку.

В принципе, я побайтно думаю смогу это сделать, или порывшись в API
WideCharToMultiByte и прочее в этом духе.
"Красивого" способа нет какого-либо?
...
Рейтинг: 0 / 0
SendMessage (WM_COPYDATA, String) Приемник - ANSI, Передатчик - Unicode (.Net)
    #38423644
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, ребят (модераторы), у вас там чего вирус на сайте?
Кнопки типа
SRC ->
COLOR->
дополнит. ->
(со стрелками)
не нажимаются.
Я нарочно на нескольких компах попробовал.
...
Рейтинг: 0 / 0
SendMessage (WM_COPYDATA, String) Приемник - ANSI, Передатчик - Unicode (.Net)
    #38423699
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77В принципе, я побайтно думаю смогу это сделать, или порывшись в API
а Marshal.StringToCoTaskMemAnsi никак не подойдёт?
всё анальным способом хочется сделать?
...
Рейтинг: 0 / 0
SendMessage (WM_COPYDATA, String) Приемник - ANSI, Передатчик - Unicode (.Net)
    #38423735
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77"Красивого" способа нет какого-либо?
Изопропилвсё анальным способом хочется сделать?Ты, либо не дочитал, либо для тебя анальный=красивый.

Я тебя еще раз попрошу, НЕ НАДО отвечать в таком стиле. Я тебя чем-то обидел?

Хорошо я поясню. Имелось ввиду .NET-методом. Иначе б не спрашивал.
Изопропила Marshal.StringToCoTaskMemAnsi никак не подойдёт?Подойдет, СПАСИБО. Именно об этом я и спрашивал.
Код: vbnet
1.
2.
3.
      cds.dwData = CType(12, IntPtr) 'идентифицирует тип команды
      cds.cbData = str_data.Length + 1
      cds.lpData = Marshal.StringToCoTaskMemAnsi(str_data)
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / SendMessage (WM_COPYDATA, String) Приемник - ANSI, Передатчик - Unicode (.Net)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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