| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > C# и WinAPI |
| Автор: erm0l0v 12.1.2011, 16:07 | ||||
| Мне нужно отправить сообщение. Загружаю SendMessage
Отправляю сообщение
Сообщение приходит, но вот значение параметра wParam Совершенно не предсказуемо. В чем может быть ошибка? |
| Автор: erm0l0v 12.1.2011, 17:32 | ||
| Кстати, забыл добавить сообщение ловит программа написанная на Delphi Только что попробовал отправить сообщение WM_SETTEXT все сработало нормально. Есть предположение что косяк в преобразовании из string C# в String Delphi. Пробовал слать это же сообщение из C++ все работает нормально. (Доступа к исходным кодам на Delphi нет) единственно что нашел в документации есть пример как отправлять это сообщение из Delphi там у них строка преобразуется так:
|
| Автор: Любитель 12.1.2011, 17:52 |
Покажите код на C++. Скорей всего там у вас анси строк, а здесь юникод (по дефолту). В дельфийской проге кастится к анси строке (указателю, но не суть). |
| Автор: erm0l0v 12.1.2011, 18:00 | ||
На C++ отправляю так:
Я не думаю что проблема с кодировкой, он каждый раз выдает разные символы. Если бы проблема была с кодировкой то думаю что символы были бы одни и теже |
| Автор: Любитель 12.1.2011, 18:23 |
| Попробуй маршалинг как анси строки для начала. |
| Автор: jonie 12.1.2011, 19:59 | ||
Правильная сигнатура должна быть такой: (http://www.pinvoke.net/default.aspx/user32.sendmessage)
там же примеры как маршалить автоматически |
| Автор: Любитель 12.1.2011, 20:54 |
| Что значит "правильная"? wParam/lParam на практике интерпретируются по разному. В принципе - делать вызовы Marshal.XxxToXxx в коде или прописать нужные типы и пр. сразу - не суть важно. Вопрос собственно в том, как интерпретируются параметры в приложении, принимающем сообщения. |
| Автор: erm0l0v 13.1.2011, 09:44 | ||
wparam по сути это ни что иное как ссылка на тип PCHAR. Именно к этому C# должен преобразовать string в конечном итоге, что он успешно делает при отправке сообщения WM_SETTEXT
А при отправке сообщения WM_WINPOST_PRINTREPORT в WinPost (и есть та самая программа на Delphi) все вместо того текста который нужен отображается что то непонятное. Чаще всего пустое поле, или 2 - 3 символа. Причем отображает каждый раз разные символы при одинаковых начальных условиях. Такое впечатление что ссылка которая дошла в WinPost указывает куда угодно, но только не на мою строку. |
| Автор: Любитель 13.1.2011, 14:38 |
Не. Вообще говоря это просто 32-битный параметр. Как он интерпретируется - другой вопрос Попробуй всё-таки явно прописать маршаллинг как LPStr. |
| Автор: erm0l0v 13.1.2011, 17:01 | ||
Я сделал так:
лучше не стало, пробовал преобразовать так Marshal.StringToXxx тоже не получилось. Может я просто не правильно использую Marshal? |
| Автор: Любитель 13.1.2011, 18:44 |
| Хм. Тогда не знаю точно :( А есть возможность выложить/прислать клинетское приложение? |
| Автор: erm0l0v 14.1.2011, 09:41 | ||
Вот мой код.
Он запускается из dll для WinPosta как процесс. Сам WinPost 107 MB можно взять http://content6-n.files.mail.ru/GR572S/017e578d21750db0c33b2a719781f3a1?from=win.mail.ru Программу можно протестировать так: В WinPost: Новый Клиент -> Услуги -> Внешний Модуль -> Пример подключаемого модуля После этого можно запустить программу, по идеи будет работать так же как если бы она была запущена из dll. Во вложении я скинул свою программку, исходный код которой приведен выше. |
| Автор: erm0l0v 14.1.2011, 16:03 |
| Все проблему решил. Я переделал C# код в dll (правда очень корява, путём пере компилирования dll в il и обратно) |