Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SendMessage в dll 
V
    Опции темы
HiVeR
Дата 3.8.2008, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 30.6.2008

Репутация: нет
Всего: нет



Доброе время суток, господа
почемуто не получается использовать SendMessage для чтения/записи текста окна.., пишу так:
Код

// для чтения
SendMessage(Wnd, WM_GETTEXT, istr, lParam(@str[1])); 
// или так для записи текста
SendMessage(Wnd, WM_SETTEXT, 255, lParam(str));

в самой программе(главный модуль) функции работают на "ура", а если оформить в dll'ке, то в обоих случаях выдаёт ошибку:
Missing operator or semicolon (промт - "Недостающий оператор или точка с запятой") и курсор устанавливается на 4ый параметр(lparam)
в чём может быть дело?, всё проверил, всё должно работать...

Это сообщение отредактировал(а) HiVeR - 3.8.2008, 17:05
PM MAIL   Вверх
THandle
Дата 3.8.2008, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 65
Всего: 372



Посмотри, предыдущая строчка оканчивается точкой с запятой(;)? Или выложи весь рядом лежащий код.
PM   Вверх
HiVeR
Дата 3.8.2008, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 30.6.2008

Репутация: нет
Всего: нет



точка с запятой стоит, всё есть, но не пойму почему не пашет, думаю что нельзя использовать lparam(), так как после ошибки курсор именно там...
вот маленькая часть моего кода:
Код

...
h2:=FindWindowEx(h1, 0,'ComboBox', nil);
h3:=FindWindowEx(h2, 0,'Edit', nil);
SendMessage(h3, WM_SETTEXT, 255, lparam(str));
End;
...

может просто в длл в данном случае нельзя использовать sendmessage?
PM MAIL   Вверх
THandle
Дата 3.8.2008, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 65
Всего: 372



Цитата(HiVeR @  3.8.2008,  18:19 Найти цитируемый пост)

может просто в длл в данном случае нельзя использовать sendmessage? 


Да с чего бы? Дай лучше полный код библиотеки, не понятно почему так.

У меня данный код работает вот так(то есть компилится):

Код

library Project1;

uses
  SysUtils,
  Classes, windows, messages;

{$R *.res}
var
  str : string;
  h1, h2, h3 : thandle;
begin
  h2:=FindWindowEx(h1, 0,'ComboBox', nil);
  h3:=FindWindowEx(h2, 0,'Edit', nil);
  SendMessage(h3, WM_SETTEXT, 255, lparam(str));
end.



Показывай весь код, так просто гадать бессмысленно.
PM   Вверх
HiVeR
Дата 3.8.2008, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 30.6.2008

Репутация: нет
Всего: нет



THandle, и вправду, работает код)
полный код очень большой и очень кривой, потому обрезал до максимума(пока ошибка сохраняется) и вот что получилось:
Код

library libr;

uses
  Windows, Messages, SysUtils;
var
 h1: Hwnd = 0;
 str: String;
function SysMsgProc(code : integer; wParam : word; lParam : longint): longint; export; stdcall; 
begin
       str:='стр';
       h1:=FindWindow(nil,'Test');
       SendMessage(h1, WM_SETTEXT, 255, lparam(str));
       End;
end.

всё дело наверно в функции..., длл использую для установки глобального хука, потому такие параметры в функции, может отсюда уже видно что нетак?
PM MAIL   Вверх
THandle
Дата 3.8.2008, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 65
Всего: 372



Проблема видимо в том что ты пытаешься привести str к параметру функции:

function SysMsgProc(code : integer; wParam : word; lParam : longint): longint; export; stdcall; 

Сделай так:
Код


function SysMsgProc(code : integer; wParam : word; lParam : longint): longint; export; stdcall; 
begin
       str:='ñòð';
       h1:=FindWindow(nil,'Test');
       SendMessage(h1, WM_SETTEXT, 255, integer(str));
End;




PM   Вверх
HiVeR
Дата 3.8.2008, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 30.6.2008

Репутация: нет
Всего: нет



 smile всё заработало, большое спасибо THandle, я даже не думал что получится поначалуsmile
а можешь плз объяснить в двух словах, что делают lparam() и integer(), был бы очень благодарен
PM MAIL   Вверх
THandle
Дата 3.8.2008, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 65
Всего: 372



HiVeR, это обычное приведение к типу. 

LParam = Integer, так что все равно к чему приводить. smile

Кстати, если вопрос исчерпан, то пометь тему как решенную. smile  
PM   Вверх
CodeMonkey
Дата 3.8.2008, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



...и я бы ещё посоветовал почитать какую-нибудь книжку по Delphi...

Просто это - самые основы. И по ним надо читать книжи.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
THandle
Дата 4.8.2008, 15:25 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 65
Всего: 372



Кстати, есть замечания по коду:

1. Export не нужен, эта директива осталась от Паскаля и Win16, в Win32-64 смысла не имеет.
2. Теперь о функции:

Код

function SysMsgProc(code : integer; wParam : word; lParam : longint): longint;


wparam не может быть word, так как тогда получается комбинирование знаковых и беззнаковых типов.

Объявление на MSDN:

Код

LRESULT CALLBACK GetMsgProc(      
    int code,
    WPARAM wParam,
    LPARAM lParam
);


То есть WPARAM ни как не может быть word'ом.

3. Фундаментальные типы(longint) не используем, так как он всегда будет 4 байта.
На Win32 и integer тоже будет 4 байта, но при переносе на Win64 будет же 8. Longint будет меньше требуемого.

Так как Integer = LParam, то и оставим как MSDN.

Поэтому меняем:

Код

function SysMsgProc(code : integer; wParam : word; lParam : longint): longint;


На:

Код

function SysMsgProc(code : integer; wParam : WPARAM; lParam : LPARAM): integer;



4. Последнее.

Цитата


WM_SETTEXT Message

Parameters

    wParam
        This parameter is not used. 
    lParam
        Pointer to a null-terminated string that is the window text. 


Интересно накой в wparam 255? Лучше обнулить:

Код


SendMessage(h3, WM_SETTEXT, 0, Integer(str));




Вот так в общем...

Кстати сейчас посмотрел в DRKB и FAQ, те же ошибки... А жаль...

PM   Вверх
CodeMonkey
Дата 4.8.2008, 15:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



offtopic
Цитата(THandle @  4.8.2008,  15:25 Найти цитируемый пост)
Кстати сейчас посмотрел в DRKB и FAQ, те же ошибки... А жаль...

Меня лично всегда изумляет, откуда изначально берётся такой код? Кто его пишет? Какими извращёнными методами он при этом пользуется? smile И, главное, выкладывают ведь на показ. Вот, типа, пользуйтесь моими "наработками".
Вот ещё два примера: http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=64211 и http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=64042

И при этом ужасает, как же много народу просто бездумно копирует эти исходники. Ведь даже за ухом не почешется: "здесь что-то не так!".


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0708 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.