Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 22 • Страница 1 из 21  2  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
И так, скорее всгео баг скрыт в Windows, так как от применяемого языка программирование это не зависит!
И так, есть WM_COPYDATA, позвоялющий реализовавыать просто IPC (Inter Process Communication). МСне он как раз и нуден для того, чтобы передавать из одной программы в другуй неких текст. Что получает у меня. Все срабатывает, но! Дурацкий windows почемуто пытается открыть IE (или если запущен Mozilla то он тоже) и выйти на какойто сайт, причем адрес сайта это кусок передаваемого мной текста!.
Чисто кусок кода как пример. Написан на Delphi, но думаю на си сами сможете перегнать если захотите проверить.

type
TMsgPack = record
texte : array[0..255] of char;
data : double;
end;

var t:TCopyDataStruct;
datapack:^TMsgPack;
begin

new(datapack);
StrPCopy(datapack^.texte,'Battle Field');
datapack^.data:= 666;
t.dwData:= 1344;
t.lpData:= datapack;
t.cbData:= sizeOf(datapack^);
SendMessage(wnd_broadcast,WM_COPYDATA,Handle,LongInt(@t));
dispose(datapack);
-----
При вызове SendMessage(wnd_broadcast,WM_COPYDATA,Handle,LongInt(@t)); сразу открывается IE. Блин вот жуть какая то!



Партнер
 

Member
Статус: Не в сети
Регистрация: 12.03.2003
Откуда: Израиль
Эээээ... А wnd_broadcast - не слишком ли сильно? Может, ты сначала по заголовку окна вычислишь HWND нужного тебе окна? И будешь слать только туда?
А то получается, что ВСЕ окна получили твой буффер с данными, и IE почему-то распознал его как свой. После чего пошел выполнять.

_________________
Более мощный компьютер глючит быстрее и точнее.


 

пробовал твой код у себя на компьютере - IE не запускается, а когда запущен - никак не реагирует... (стоит Windows XP, Delphi 7, Delphi 5)


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
tanatik Черт, а у меня срабатывает! :( В чем причина не понимаю! У тебя какой версии IE? Стоит ли SP под XP?

WhPh
Так не могу, потому что это одна и таже программа. Просто при запускке ее второй копии, она отсылает эти данные первой копиеи завершается. Соответственно у нее оба заголовка окна одинаковые :)


 

Member
Статус: Не в сети
Регистрация: 12.03.2003
Откуда: Израиль
Ray Adams
Могу предложить два варианта:
1. Использовать EnumWindows: HWND своего окна ты знаешь.
2. Сделать проверку на существование окна с заданным именем (FindWindow) _до_ открывания своего окна.

Оба варианта должны дать тебе нужный HWND для подставления в SendMessage

_________________
Более мощный компьютер глючит быстрее и точнее.


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
WhPh Плюнул. Сделал по другому через RegisterWindowsMessage :)


 

Member
Статус: Не в сети
Регистрация: 15.04.2004
Откуда: Москва
Ray Adams
А можно и через пайпы (если обе программы написаны тобой).

_________________
Цель жизни - d20 по жизни...


 

Junior
Статус: Не в сети
Регистрация: 10.03.2004
Откуда: Петрозаводск
Ray Adams
Непонятно, в чем проблема.
Пишешь на Delphi.
Поэтому ДО Application.CreateForm ищешь предыдущую запущенную программу (FindWindow), отсылаешь ей WM_COPYDATA и завершаешься. По уму, так надо еще Mutex ставить/проверять.
BROADCAST уж слишком криво и не эстетично.
Главное, не создавать MainForm без надобности.

P.S. А как ты определяешь, что запущена уже вторая копия?..
P.P.S. Научи, как RegisterWindowMessage заменяет WM_COPYDATA?


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
МДМ
Предыдущая копия определяется через mutex.
RegisterWindowMessage - создает глобальное сообщение и его я отсылаю через SendMessage (wnd_broadcast,IPCMessage,0,0);
где IPCMessage:=RegisterWindowMessage('тут уникальное имя');
И все, только моя программа и получит это сообщение так как другие просто не знают о существовании этого сообщения. :)


 

Junior
Статус: Не в сети
Регистрация: 10.03.2004
Откуда: Петрозаводск
Ray Adams
Я в курсе, что такое RegisterWindowMessage. И что, это реальная замена WM_COPYDATA? Если я не ошибаюсь, последнее предназначено, в частности, для передачи строки. В остальных случаях по 4 байта уточняющей информации, в которую строка может и не поместиться. И не поместится.

Предыдущая копия определяется через mutex.
Ну и?.. Если есть уже работающая копия, находишь ее по FindWindow, засылаешь сообщение и закругляешься. Типа, Exit или Halt.


 

Member
Статус: Не в сети
Регистрация: 15.04.2004
Откуда: Москва
МДМ
А маршаллинг тебе на кой черт?

_________________
Цель жизни - d20 по жизни...


 

Junior
Статус: Не в сети
Регистрация: 10.03.2004
Откуда: Петрозаводск
Avaddon
А теперь скажи, что это такое.


 

Member
Статус: Не в сети
Регистрация: 15.04.2004
Откуда: Москва
МДМ
Да есть такая методика передачи данных между процессами, можно даже между компами.
Маршаллинг - основа COM технологий.
Для передачи данных между процессами, тебе надо "запаковать" данные (это и есть маршаллинг), и передать
интерфейс, в который была проведена запаковка. При получении - взять этот интерфейс и достать оттуда данные.
Что бы не заниматься геммороем можно гонять через стандартные интерфейсы, типа IDataStore

_________________
Цель жизни - d20 по жизни...


 

Junior
Статус: Не в сети
Регистрация: 10.03.2004
Откуда: Петрозаводск
Avaddon
А зачем такие сложности? Дали ведь WM_COPYDATA, надо пользоваться.
Хотя, на вкус и цвет фломастеры разные. И еще я до ужаса "боюсь" интерфейсов. :)


 

Member
Статус: Не в сети
Регистрация: 15.04.2004
Откуда: Москва
МДМ
зря ты их боишься :) Они белые и пушистые.
А зачем? Хорошо, когда у тебя все в рамках одного компа...
А если приложения работают на разных компах?
При использовании интерфейсов разницы нет никакой...

_________________
Цель жизни - d20 по жизни...


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
Avaddon Раз пошла такая пьянка, то пример в студию!


 

Member
Статус: Не в сети
Регистрация: 15.04.2004
Откуда: Москва
Ray Adams
Блин, а MSDN на тему IPC посмотреть лень? :)
1. Реализуешь в своих приложениях интерфейс - IDataReciver например.
IDataReciver = interface(IUnknown)
procedure ReciveData( pData: IDataStoreObject); stdcall;
end.
Имплементируешь его, в модели синглтон.
В процедуре ReciveData делаешь примерно так:
var Value: Variant;
begin
Value := pData.GetValue("Имя");
потом с этим вариантом делаешь что хочешь.

В отправлятеле создаешь кокласс DataReciver (через CreateObject) - результат будет однозначным, т.к. синглтон.
Создаешь DataStoreContainer, потом DataStoreObject так
pDSO := pDSC.Create("МойКласс","Мое имя");
pDSO.PutValue("Имя",Value);
и дергаешь ReciveData.

P.S. Если ты передаешь через Variant данные в виде byte array, то с интерфейсами можешь вообще не заморачиваться.

_________________
Цель жизни - d20 по жизни...


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
ненавижу все что связанно с COM/DCOM и тому подобными крутыми идиотизмами от мелкого софта :)
Цитата:
Блин, а MSDN на тему IPC посмотреть лень?

Мне это не надо, вот если ты полностью готовый код приведеш за свой вариант , тогда хорошо. Но мне кажется, чтобы передать простые данные незачем заморачиваться с COM обьектами. Как минимум увеличивается размер программы как на диске так и в оперативке, а моя прога постоянно висит в памяти! :)


 

Member
Статус: Не в сети
Регистрация: 15.04.2004
Откуда: Москва
Ray Adams
Согласен. Но есть много "но".
1. Если твое приложение всегда будет работать на одном компе.
2. Если данные, действительно простые.
3. Если над этими данными не производится какой-либо сложной обработки.
В остальных случаях - интерфейсы, интерфейсы, и еще раз интерфейсы.

_________________
Цель жизни - d20 по жизни...


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
1. Да
2. Да (просто сточка)
3. Ничгео не далется
-----
Ну не люблю я эти интерфейсы так как с ними никогда нормально не работал, не было надобности. Потому и хотел чтобы ты привел полностью готовый рабочий пример, а я бы подчерпнул наконец истину о COM обьектах


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 22 • Страница 1 из 21  2  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  

Лаборатория














Новости

Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan