|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Я для передачи команд (строк) между приложениями использую два IPC-метода: 1) Mailslot 2) SendMessage(WM_COPYDATA) -сейчас почти нигде не оставил в пользу первого В переписываемом .Net приложении я делаю упор на Юникод, т.е. все API декларируются Код: vbnet 1.
все структуры с намеком на строки Код: vbnet 1.
Чтение /запись в MailSlot базируется на ф-циях ReadFile/WriteFile. В случае WM_COPYDATA передается структура COPYDATASTRUCT. И в том и другом случае речь идет о передаче НАБОРА БАЙТОВ а не строк, поэтому в оригинале нет отдельных определений "A" и "W" Вот собственно не знаю как поступить. Могу оставаться в ANSI (для этих методов): Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Могу "мигрировать на Юникод" Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Сложность выбора еще в том, что у меня есть C++(ANSI) -модуль, в котором также присутствует MailSlot , он обменивается c VB.Net -приложением (только EN-строки), но это же VB.Net обменивается с другим VB.Net. Если посылать раздельно ANSI/Unicode (в разные приложения) можно без проблем, то приемник один (т.е. в него нельзя слать ANSI/Unicode кашу). VB.Net компоненты могут передавать меж собой "русские" (не-EN) тексты. От требования к системе: русский язык для не-юникод программ для "русской версии" я хочу отказаться. Если я оставлю ANSI в этом вопросе, не получу ли я проблем с передачей русского текста (при отключенной поддержке для не-Юникод программ)? Комп то вроде по любому один и тот же. Как закодирует, так и раскодирует. Как тут посоветуете поступить? И еще. Конечно не стоит мешать API с .Net, хотя бы в случае с mailslot, нельзя как-то заменить ReadFile/WriteFile на StreamWriter/Reader? Т.е. явно задавать/определять кодировку при чтении записи в файл (т.е в Mailslot) UTF8 с флагом или как там его(недавно обсуждали)/Default ANSI, handle mailslot-а известен.??? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2015, 12:29 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
base64 кодируй при отправке, при приёме декодируй ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2015, 12:34 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
маршаллинг прарметров явно задай (как массив байтов с указаием параметра-длины) , буферу будет насрать на вызов A или U Дмитрий77От требования к системе: русский язык для не-юникод программ для "русской версии" я хочу отказаться. это правильно Дмитрий77нельзя как-то заменить ReadFile/WriteFile на StreamWriter/Reader? Т.е. явно задавать/определять кодировку при чтении записи в файл (т.е в Mailslot) UTF8 с флагом или как там его(недавно обсуждали)/Default ANSI, handle mailslot-а известен.??? никакого смысла. получил пакет в виде набора байтов - интерпретируй как хочешь, поток не поможет можно рассмотреть вариант - во всех приложениях использовать UTF-8 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2015, 13:17 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Дмитрий77, при работе с набором байтов разницы между ANSI и Unicode не будет. Однако по моему ты неправильно объявил ReadFile/WriteFile/COPYDATASTRUCT. Ты говоришь об обмена байтами, а используешь тип String для lpBuffer/lpData. По моему там должен быть IntPtr т.к. в С/С++ они объявлены как LPVOID. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2015, 13:54 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Давайте про mailslot только рассуждать чтоб не путаться. Ну, насколько я понимаю, что если 1) строка "русская" 2) язык системы для не-юникода - "китайский" 3) WriteFile и ReadFile декларированы как ANSI т.е. (...ByVal lpBuffer As String) то на выходе все таки получим фигню а не "русский". Т.е. не сумеет он в общем случае кодировать в ANSI и декодировать из ANSI. Так? Т.е. все-таки передавать надо Unicode? >маршаллинг прарметров явно задай Какая разница в данном случае написать слово Unicode перед ф-цией или лепить <Marshall.> перед as String?. Задекларировав функции как Declare Unicode Function , ну или прописав маршалинг параметров как Юникод я эту задачу решаю (передается Юникод хз там в какой кодировке согласно API понятиям но без искажений). Естественно хочется As String для простоты использования. === Но остается тогда нерешенной следующая задача: Предположим есть exe, есть mailslot. Одно приложение шлет в него ANSI (C++, только EN, переписывать/перекомпилировать на Unicode не буду). Другое приложение шлет в него Unicode. Как извернуться (с единственным mailslot)? Объясню почему я вспомнил про StreamWriter/Reader. Потому что mailslot -по сути файл с операциями записи чтения в него. В StreamWriter/Reader есть параметр Encoder, применяя который можно задать BOM (явное указание UTF8 например). Т.е. нельзя ли эту автоматику как то присобачить? Приходит строка с BOM -конвертируется из UTF8, без BOM -значит ANSI. Хотя опять же, не уверен. BOM же в начало файла ставится а как это на MailSlot переложить... Функции для MailSlot у меня со времен VB6 такие, декларации для ANSI и Unicode я привел выше. Код: 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. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49.
Видимо надо тест-проект создавать и играться. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2015, 14:07 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
bazileДмитрий77, при работе с набором байтов разницы между ANSI и Unicode не будет. Однако по моему ты неправильно объявил ReadFile/WriteFile/COPYDATASTRUCT. Ты говоришь об обмена байтами, а используешь тип String для lpBuffer/lpData. По моему там должен быть IntPtr т.к. в С/С++ они объявлены как LPVOID. Ты абсолютно прав. В оригинале там конечно байты, а не строки. По этой причине в ReadFile/WriteFile/COPYDATASTRUCT и нет деления на "A" и "W". Но я то знаю что я работаю ТОЛЬКО со строками. Поэтому могу довериться автоматике/маршалингу. Если объявлю ReadFile/WriteFile как Unicode -буду передавать Unicode-строки, если ANSI -то ANSI. главное чтоб одинаково для Read и Write. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2015, 14:16 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Дмитрий773) WriteFile и ReadFile декларированы как ANSI т.е. (...ByVal lpBuffer As String) ну не надо буфер как строку передавать- передавай байты. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2015, 14:20 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Дмитрий77Но остается тогда нерешенной следующая задача: Предположим есть exe, есть mailslot. Одно приложение шлет в него ANSI (C++, только EN, переписывать/перекомпилировать на Unicode не буду). Другое приложение шлет в него Unicode. Как извернуться (с единственным mailslot)? Объясню почему я вспомнил про StreamWriter/Reader. Потому что mailslot -по сути файл с операциями записи чтения в него. В StreamWriter/Reader есть параметр Encoder, применяя который можно задать BOM (явное указание UTF8 например). Т.е. нельзя ли эту автоматику как то присобачить? Раз ты контролиуешь обе стороны обмена, то можно. При наличии ВОМ класс StreamReader игнорирует переданную ему кодировку и использует кодировку указанную через BOM. Сам массив данных можно трактовать как поток с помощью MemoryStream. Передавать при этом мы будем всегда массив байтов. Код фукнций подготовки данных и их чтения на стороне .NEТ можно организовать примерно так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2015, 14:49 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Изопропилну не надо буфер как строку передавать- передавай байты. А что это даст кроме гимора с конвертацией в байты и обратно? Я ж все равно не угадаю юникодные это байты или ANSI (если мне приходят "наборы двух типов", а чтобы понять от кого пришло надо прочесть чего там написано, а не зная ANSI или Unicode и не прочтешь, если только собственные "байт-метки" ставить, но это уже маразм). По хорошему декларировать все как Юникод (As String) и все типа в шоколаде. Это если не выходя за пределы .Net. Это я сделаю, это работает. Но что тогда делать с C++ которое отправляет и принимает ANSI. Причем сам C++ проект -чистое ANSI и Юникод там нафиг не нужен (для всего проекта). Код там такой: Код: plaintext 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. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42.
Вот как эти две "функции" переписать на прием/отправку именно Юникода? При том что весь проект в ANSI. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2015, 15:22 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
bazile, т.е. я правильно понимаю, что при отправке юникод сообщения(UTF-8) я BOM добавляю в начало КАЖДОГО сообщения (массива байтов) - т.е на этапе формирования именно массива байтов? Соответственно если надо отправить в ANSI, то делаю массив с кодировкой .Default? А на обратном пути автоматика на основании наличия/отсутствия BOM? При этом конечно ReadFile/WriteFile декларирую однозначно с массивом байтов (IntPtr, надо смотреть) - инвариантно для обоих случаев - как в оригинале. Ну по крайне мере чутье не обмануло. Хотя я имел ввиду запись BOM в MailSlot (интерпретируя его как файл). Идея дошла. Спасибо. Пошел делать тест-проект, играться и переписывать свои ф-ции. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2015, 15:41 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Дмитрий77т.е. я правильно понимаю, что при отправке юникод сообщения(UTF-8) я BOM добавляю в начало КАЖДОГО сообщения (массива байтов) - т.е на этапе формирования именно массива байтов? Соответственно если надо отправить в ANSI, то делаю массив с кодировкой .Default? А на обратном пути автоматика на основании наличия/отсутствия BOM? Да. Дмитрий77Хотя я имел ввиду запись BOM в MailSlot (интерпретируя его как файл). Никто не мешает тебе написать класс MailSlotStream инкапсулирующий всю эту логику. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2015, 16:02 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
bazileДмитрий77Хотя я имел ввиду запись BOM в MailSlot (интерпретируя его как файл). Никто не мешает тебе написать класс MailSlotStream инкапсулирующий всю эту логику. Не-не, здесь нет никакой здравой логики. Я то хотел по hMailSlotHandle открыть его как файл и использовать StreamWriter/Reader, ВМЕСТО ReadFile/WriteFile , возможно частично сделать что-то здесь можно, например указав "\\.\mailslot\MailSlotMyName" в качестве пути к файлу (на запись возможно да, если атрибуты - аналог CreateFile подберу), но я сомневаюсь что что-то путное выйдет. Короче счас попробую твою идею с подготовкой/чтением массива байтов + родные ReadFile/WriteFile. А уж потом посмотрю можно ли ему сообщение послать чисто через StreamWriter. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2015, 16:24 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Дмитрий77его как файл и использовать StreamWriter/Reader, ВМЕСТО ReadFile/WriteFile , это НИКАК не влияет на решение задачи ( кодировку текста) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2015, 16:48 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Дмитрий77Не-не, здесь нет никакой здравой логики. "Спасибо" за высокую оценку. В моем понимании это наоборот прекрасно укладывается в .NET логику. Ты хочешь работать с mailslot через StreamWriter который умеет оборачиваться вокруг другого потока. Т.к. в нет класса наследника Stream который умеет работать с MailSlot, то значит можно написать свой класс для этой задачи. Дмитрий77Я то хотел по hMailSlotHandle открыть его как файл и использовать StreamWriter/Reader, ВМЕСТО ReadFile/WriteFile Конструктор FileStream позволяет передать дескриптор уже открытого потока. Затем FileStream можно передать StreamWriter/Reader. Попробуй так. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2015, 17:23 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
bazile Код: vbnet 1. 2. 3. 4.
Так не хочет BOM к массиву пре-приписывать. Вроде вот так получается (до конца еще не доделал): Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
Проще нельзя этот BOM приписать? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2015, 18:10 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Дмитрий77Проще нельзя этот BOM приписать? можно ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2015, 18:57 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
ИзопропилДмитрий77Проще нельзя этот BOM приписать? можно Ты вот это имел ввиду? Код: vbnet 1. 2.
Это на .Net2 не фурычит, а я как ты возможно помнишь не рискну отказываться хотя бы от совместимости кода. Или что-то другое имелось в виду? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2015, 19:56 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Ну вот вроде допилил, все типа работает: Код: 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. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196.
Bazile, спасибо. bazileКонструктор FileStream позволяет передать дескриптор уже открытого потока. Затем FileStream можно передать StreamWriter/Reader. Попробуй так. Там все методы с Intptr первым параметром "устаревшие" (компилятор подчеркивает). Я попробовал интереса ради. Типа через задницу работает (отправка), но при этом вместо одного сообщения отправляется 2, первое пустое, а нужное приходит с задержкой в несколько секунд, уж не знаю чего там эта муть делает. При попытке подсунуть имя mailslot-а в FileStream или StreamWriter всегда имеем: Дополнительные сведения: FileStream не открывает устройства Win32, такие как логические диски и ленточные накопители. Избегайте использования "\\.\" в пути. Через API WriteFile/ReadFile все работает как и положено четко. Данный совет приписывать BOM к массиву байтов озвученную проблему "автоматики при приеме" решил. ==== По mailslot у меня один наверно вопрос еще. Я использую таймер который запускает ф-цию ReadApplyMessages_MailSlot() раз в секунду (в коде формы, код под спойлером). Т.е. время ожидания и обработки сообщения может затянуться (максимум на 1 секунду). В принципе для моих целей это приемлимо, но все же. В VB6 к сожалению с многопоточностью хреново. По хорошему это надо крутить циклом в отдельном потоке. Не подскажете как в .Net лучше сделать? Есть еще опасения что при выполнении команд буду нарываться на ошибки типа "вы пытаетесь дорваться до чего-то что было создано в другом потоке", посему особо не горю желанием такие штуки сгоряча и без опыта имплементировать. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2015, 21:56 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Дмитрий77Или что-то другое имелось в виду? да Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2015, 00:17 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Дмитрий77Есть еще опасения что при выполнении команд буду нарываться на ошибки типа "вы пытаетесь дорваться до чего-то что было создано в другом потоке" настоящий программист документацию не читает ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2015, 00:21 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
ИзопропилДмитрий77Или что-то другое имелось в виду?да Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
Уже подумал о том что MemoryStream можно использовать обратно с StreamWriter (по аналогии с распаковкой в строку). Спасибо за код. Тогда лучше думаю так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
Иначе придется обрезать лишнее: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
ИзопропилДмитрий77Есть еще опасения что при выполнении команд буду нарываться на ошибки типа "вы пытаетесь дорваться до чего-то что было создано в другом потоке" настоящий программист документацию не читает По MailSlot я документацию читал и примеры смотрел. Иначе б этот вопрос не возник. Просто это делалось под VB6 и таймер был выбран как наиболее разумный способ чтения MailSlot (VB6 при создании потока через API крашит, поэтому научился обходиться без них). .Net документацию по потокам - нет, не читал пока. Насколько понимаю, тема не очень тривиальная и с ней надо разбираться отдельно. Так что пока оставлю ту логику что есть, вопрос снимаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2015, 08:07 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Вызов метода в UI потоке - control.Invoke - ничего сложного, код в форме от таймерного отличаться не будет Массив из memoryStream - не твой - просто скопируй нужное количество байтов в свой массив ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2015, 08:18 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
ИзопропилМассив из memoryStream - не твой - просто скопируй нужное количество байтов в свой массив Ну. А разве buffer = mstream.ToArray() именно это и не делает в одну строчку? Просто все копирования mstream.GetBuffer() с учетом mstream.Length -оно ни чуть не менее муторней чем тупое сложение массивов System.Text.Encoding.UTF8.GetPreamble() и System.Text.Encoding.UTF8.GetBytes(sMessage) - изначальный вариант ИзопропилВызов метода в UI потоке - control.Invoke - ничего сложного, код в форме от таймерного отличаться не будет Что значит не будет? Получил я message, мне например надо: нажать кнопку на форме, выгрузить форму, поменять надпись на форме... выполнить какую нибудь public function из модуля, которая на эту форму ссылается и т.п. Это хорошо еще если я к этой форме только в режиме чтения обращаюсь, или просто какие-то левые дела в этом ново-потоке делаю. А в общем случае это надо переписывать код, с отработкой заново всех потенциальных глюков. Не, давай забьем пока эту тему. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2015, 09:00 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Дмитрий77Что значит не будет? Есть форме(контроле) метод. без разницы - из таймера Invoke делать или из другого потока. Нет никаких глюков. В UI потоке будет вызываться ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2015, 10:28 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Вроде вот с WM_COPYDATA сделал по аналогии: Код: 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. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82.
Но у меня получилось только с Dim lpData As IntPtr + Marshal.AllocHGlobal + Marshal.FreeHGlobal А упрощенный вариант почему-то не работает. Код: vbnet 1. 2. 3. 4. 5. 6.
Собственно код: Код: 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. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50.
Т.е. он работает, но если посылать сообщение своему окну. А если чужому, то lpData As Byte() в target не читается (ptr получает а содержимое отсутствует). Для сравнения Если писать Dim lpData As String, то работает (с оговоркой про ANSI/Unicode естественно) В Mailslot+ReadFile/WriteFile, ByVal lpBuffer As Byte() на ура прокатило без всяких IntPtr. Где напортачил в нижнем коде? М.б. <MarshalAs(UnmanagedType. ???> Dim lpData As Byte() какой нибудь надо подставить? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2015, 13:25 |
|
|
start [/forum/topic.php?fid=20&msg=38876447&tid=1401915]: |
0ms |
get settings: |
12ms |
get forum list: |
13ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
55ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 175ms |
0 / 0 |