Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 | 3 | 4 | 5 |

 

  Вопрос: Альтернатива ICQ-ActiveX контролу!! Обсуждение Добавлено: 26.09.05 00:43  

Автор вопроса:  Apache2 | ICQ: 162823477 

Ответить

  Ответы Всего ответов: 66  

Номер ответа: 46
Автор ответа:
 Apache2



ICQ: 162823477 

Вопросов: 31
Ответов: 114
 Профиль | | #46 Добавлено: 28.09.05 21:05
такого точно в книжках по программированию не пишут...
тут я вижу без исходников не обойтись
например у меня подчёркивает ошибкой:
WM_COPYDATA
COPYDATASTRUCT
эти комманды нужно объявить..
и что это за процедура.. приёма?

не могли бы вы на VB.NET выложить 2-а исодника - один отправляет DAta
другой принимает.. так будет вопрос исчерпан
Пожалуйста.

Ответить

Номер ответа: 47
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #47
Добавлено: 29.09.05 05:19
Apache2,
 В общем форуме только по VB6 дают код. Спроси в форуме.NET.

Ответить

Номер ответа: 48
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #48
Добавлено: 29.09.05 05:30
В WM_COPYDATA ничего сложно нет, это Neco специально тебя путает :) Ты посылаешь окну сообщение WM_COPYDATA (константа WM_COPYDATA=&H4A). В оконной процедуре окна, которая принимает сообщение, находится обработчик, который получая (среди множества других) сообщение WM_COPYDATA забирает посланные данные, которые описаны в типе COPYDATASTRUCT.
Private Type COPYDATASTRUCT
dwData As Long
cbData As Long
lpData As Long
End Type

Ответить

Номер ответа: 49
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #49
Добавлено: 29.09.05 05:31
В оконной процедуре окна, которая принимает сообщение

 В оконной процедуре окна, котороя принимает сообщение

Ответить

Номер ответа: 50
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #50
Добавлено: 29.09.05 06:22
В оконной процедуре окна, которое принимает сообщение? :))

Ответить

Номер ответа: 51
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #51
Добавлено: 29.09.05 06:49
Ага, я решил больше не постить - не судьба видимо :)))

Ответить

Номер ответа: 52
Автор ответа:
 Apache2



ICQ: 162823477 

Вопросов: 31
Ответов: 114
 Профиль | | #52 Добавлено: 29.09.05 17:18
ребята, для меня это тёмный лес..

не могли бы вы на каком-нить языке выложить 2-а исодника - один, который отправляет DAta, а
другой принимает.. так будет вопрос исчерпан
Пожалуйста.
а тоя как я не напишу - одни ошибки..

Ответить

Номер ответа: 53
Автор ответа:
 Apache2



ICQ: 162823477 

Вопросов: 31
Ответов: 114
 Профиль | | #53 Добавлено: 29.09.05 17:18
ребята, для меня это тёмный лес..

не могли бы вы на каком-нить языке выложить 2-а исодника - один, который отправляет DAta, а
другой принимает.. так будет вопрос исчерпан
Пожалуйста.
а тоя как я не напишу - одни ошибки..

Ответить

Номер ответа: 54
Автор ответа:
 DaSharm



ICQ: 780477 

Вопросов: 72
Ответов: 1297
 Web-сайт: dasharm.com
 Профиль | | #54
Добавлено: 29.09.05 17:45

Альтернатива ICQ-ActiveX контролу!!


ребята, для меня это тёмный лес..


Пожалуйста.
а тоя как я не напишу - одни ошибки..


Альтернатива ICQ-ActiveX контролу!!

Ответить

Номер ответа: 55
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #55
Добавлено: 29.09.05 22:55
Apache2, пардон, я твой ник спутал с созвучным Comanche - думал, что просто пасс забыл вот и придумал такой ник, чтобы его узнавали - а оказывается я обшибся.
Втупую исходники мне писать влом - т.к. там помимо основного механизма, надо ещё наромадить кучу вещей (к примеру, откуда другим окнам узнать хэндл твоего окна - реестр? Я так и делал, но не хочу тебя сбивать, т.к. это не лучший выход [i think so]) для которых я не имею правильного решения.
DaSharm, наверное, правильно заметил - тебе надо ещё многое узнать, прежде чем ты напишешь эту альтернативу его контролу. Просто начинай создавать классы под это дело и сам не заметишь, как нужная прога будет у тебя в руках. Кроме того, я думаю, что написание таких вещей, как вызовы API-функций лучше не начинать изучать на VB.NET - на нём надо это делать, уже уверенно зная, ЧТО ты кодишь. К примеру, эту стуктуру тебе будет проще понять на VB6:

Private Type COPYDATASTRUCT
    dwData As Long
    cbData As Long
    lpData As Long
End Type

чем на VB.NET:

    <StructLayout(LayoutKind.Sequential, pack:=1)> _
    Private Structure COPYDATASTRUCT
        Public dwData As Int32
        Public cbData As Int32
        Public lpData As Int32
    End Structure

потому что тебе мало того, что надо знать, как ОБЫЧНО передаётся структура, а ещё, что в VB.NET она так не передаётся и её надо ЗАСТАВИТЬ передаться так, как нужно.
Не говоря уж об маршаке, с его прибабахами (хотя эти прибабахи мне уже по душе).
Поэтому, лучше VB6 - а потом уже .NET. Я вообще не знаю можно ли учиться на сходу на НЭТе.
---------------------
Короче - что такое API-функции:
Винда, такая штука, которая не даёт тебе (тока по большому блату) работать напрямую с устройствами - и это хорошо. Она предлагает тебе набор функций, которыми ты можешь пользоваться, чтобы указать ей, что ты хочешь сделать. Функции расположены в библиях (dll). Библии могут располагаться в некотрых системных папках, либо рядом с экзешником (подробнее где-нить в другом месте посмотри - я не помню, кто там приоритетнее). К примеру, kernel32.dll, user32.dll и какая-нить твоя hui.dll. Это может любая dll'ка. Библия по своей структуре гораздо проще экзешника - ей не надо исполняться - там буквально таблица экспорта (список функций, которые можно вызвать из этой библии), таблица импорта (список функций, которые использует сама библиотека) и собс-на функции. Ну может ещё какая-нить хрень типа ресурсов - хз.
Теперь тебе надо вызвать такую функцию. Делается очень просто:

Private Declare Function MessageBeep Lib "user32.dll" (ByVal wType As Long) As Long
Private Sub Form_Load()
    MessageBeep 0
End Sub

Можно чуть усложнить:

Private Declare Function MessageBox Lib "user32.dll" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long
Private Sub Form_Load()
    MessageBox Me.hwnd, "Привет от API!", "Caption", 0
End Sub

Ну и так в том же духе.
Декларации для системных библиотек лучше брать из прог типа ApiViewer'а.
Когда ты вызываешь этот MessageBox, ты передаёшь ему в качестве первого параметра четыре байта (me.hwnd это Long) инфы о твоём окне (в данном случае - хэндл) и указатели на строковые переменные, находящиеся в памяти твоего процесса, которые (указатели) тоже являются четырьмя байтами.
Всего 4х4=16 байт. Хотя, как видно, строки можем пихать гораздо длиннее.
Это потому что передаётся не вся строка, а указатель на неё. Потом функция прочтёт из памяти то, что находится по этому указателю до vbNullChar и будет считать это нужной строкой.
Таким же макаром передаются структуры - только их размер заведомо оговорён и поэтому не надо искать vbNullChar, а просто надо считать (для примера беру стуктуру COPYDATASTRUCT) три раза по четыре байта и остановиться.
Рабочий пример операций со структурами:

Private Declare Function FindFirstFile Lib "kernel32.dll" Alias "FindFirstFileA" (ByVal lpFileName As String, ByRef lpFindFileData As WIN32_FIND_DATA) As Long
Private Const MAX_PATH As Long = 260
Private Type FILETIME
    dwLowDateTime As Long
    dwHighDateTime As Long
End Type
Private Type WIN32_FIND_DATA
    dwFileAttributes As Long
    ftCreationTime As FILETIME
    ftLastAccessTime As FILETIME
    ftLastWriteTime As FILETIME
    nFileSizeHigh As Long
    nFileSizeLow As Long
    dwReserved0 As Long
    dwReserved1 As Long
    cFileName As String * MAX_PATH
    cAlternate As String * 14
End Type

Private Sub Form_Load()
    Dim f As WIN32_FIND_DATA
    If FindFirstFile("c:\*", f) Then
        Debug.Print f.cFileName
    End If
End Sub

Важно, что библиотека всегда использует ту же память, что и процесс, т.к. она сама находится в этой памяти - процесс её сам туда и загружает. Поэтому при работе с ней можно свободно оперировать указателями. Но когда ты начинаешь передавать указатели в другие процессы, то в NT системах они теряют силу - т.к. указывают уже не на то, что надо. Следовательно, надо искать другие способы - один из них WM_COPYDATA.
И ничего я не усложняю. 8)

> такого точно в книжках по программированию не пишут...
Всё, что там - это по Рихтеру. Я тока передрал.

> и что это за процедура.. приёма?
Процедура, которая принимает оконное сообщение и вытаскивает данные из lParam.

> не могли бы вы на VB.NET выложить 2-а исодника - один отправляет DAta
> другой принимает.. так будет вопрос исчерпан
Не - вряд ли его можно так быстро исчерпать. 8)
Слишком уж он обширный. А когда начнёшь на тонкости в своей проге переходить, то совсем запутаешся - поэтому тебе же лучше будет, если сам напишешь. Просто спрашивай последовательно, а не "как написать ось?". 8)

> ребята, для меня это тёмный лес...
Для всех когда-то было.

Всё - у меня парсер html незаконченный, уже кричит, чтобы я его дописал.

Ответить

Номер ответа: 56
Автор ответа:
 Apache2



ICQ: 162823477 

Вопросов: 31
Ответов: 114
 Профиль | | #56 Добавлено: 30.09.05 01:51
как я понял и мои глупые вопросы:

хэндл приложения можно получить узнав свойство Me.hwnd

хэндл - это типа индификатор только чего - не понял, то ли процесса.. или приложения.. или внутри приложения..

Private Type COPYDATASTRUCT
    dwData As Long
    cbData As Long
    lpData As Long
End Type

здесь явно не хватает ссылик Declare на Dll.. и её функцию.
на счё константы - пишет ошибка:
Public Const WM_COPYDATA = &H4A

возможно по первой причине..

по интуитивным догадкам чувствую что не хватает именно этой функции:


Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long


-------------------
так сначала..вписал эти 3-и штуки.. снова.. пишет что нельзя так публиковать.. как ни крутил.. - ошибка..
-----------------
я отлично понимаю, с чём едят API.. только без хэндлов.. и как он работает..
мне важно..рабочий вариант для копания.. и модификации.. отпраки другому приложению.. сообщения.

Ответить

Номер ответа: 57
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #57
Добавлено: 30.09.05 04:49
Но когда ты начинаешь передавать указатели в другие процессы, то в NT системах они теряют силу - т.к. указывают уже не на то, что надо.

 Это не из за NT, а из за страничной адресации. У каждого процесса своё адресное пространство. Указатель(по сути адрес) является на самом деле линейным адресом, который представляет из себя запись (или говоря твоим языком структуру) из трёх полей. С помощью регистра CR3 процессор в нулевом кольце переводит линейный адрес в физический. На wasm.ru есть статья на эту тему.

И ничего я не усложняю. 8)

 Я же не говорю что нарочно. Наверное чистые Си-программисты все такие ;)

Ответить

Номер ответа: 58
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #58
Добавлено: 01.10.05 03:13
Это не из за NT, а из за страничной адресации. У каждого процесса своё адресное пространство.

Просто я думал, что только в NT-виндах у каждого процесса своя память. Вроде как этим и объясняется её стабильность по сравнению с девятииксовой линейкой, у которой каждый процесс лезет куда хочет.
Я же не говорю что нарочно. Наверное чистые Си-программисты все такие ;)

Дык какой же я чистый - я с vb6 начинал. 8)
И горжусь этим - офигенный язык.

Ответить

Номер ответа: 59
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #59
Добавлено: 01.10.05 03:37
хэндл приложения можно получить узнав свойство Me.hwnd

Me.hWnd - хэндл окна Me.
хэндл - это типа индификатор только чего - не понял, то ли процесса.. или приложения.. или внутри приложения..

Вообще, насколько я понял Рихтера хэндл это то, что индефицирует не только объект с которым производятся действия, но и кучу атрибутов, типа как доступ, либо вызывающий процесс. И нужны они, чтобы по нескольку раз не повторять одни и те же операции. Типа как открываешь ты процесс - тебе выдаётся хэндл, описывающий объект, права, наследуемость и процесс, открывший хэндл. В будущем при работе из этого же процесса тебе надо лишь указать хэндл - винда посмотрит в списке, узнает тебя и разрешит работать.
Только вот хэндлы окон под такое понимание как-то не вписываются... 8(
здесь явно не хватает ссылик Declare на Dll.. и её функцию.

Да нет - описание стуктуры это как описание константы - в принципе оно никак не связано с библиотекой.
Насчёт ошибки с константой - внимательнее читай, что тебе пишет Вася - он ругается на то, что ты объявляешь её публично - переделай на приват, либо засунь в модуль.
я отлично понимаю, с чём едят API..

Ну вот видишь - я уже лишка хватил с объяснениями, а ты говоришь "объясняйте понятнее". 8)
мне важно..рабочий вариант для копания.. и модификации.. отпраки другому приложению.. сообщения.

Как говорилось в фльме "Я - робот":
Извини, в ответах я ограничен - правильно задавай вопросы.
8)
Я к тому, что сейчас, к примеру, я пишу с работы, где у меня нет средств разработки, а я не такой крутой программер, чтобы всё это в блокноте накидать. А дома у меня куча начатых интересных проектов, которыми тоже хочется заняться.
Да и той инфы, что здесь есть вполне хватает для того, чтобы по крайней мере начать. А готовый код тебе мало что даст - к примеру, сейчас у тебя был рабочий код с объявами API-функций, а объявленные тобой функции не хотят работать из-за публичного объявления. Просто потому что ты не попарился с объявами и не выяснил толком как они работают.
Тут разве что сабклассинга нет - но это тема уже весьма заезжена - несложно отыскать.

Ответить

Номер ответа: 60
Автор ответа:
 Apache2



ICQ: 162823477 

Вопросов: 31
Ответов: 114
 Профиль | | #60 Добавлено: 01.10.05 04:50
В WM_COPYDATA ничего сложно нет, это Neco специально тебя путает :) Ты посылаешь окну сообщение WM_COPYDATA (константа WM_COPYDATA=&H4A). В оконной процедуре окна, которая принимает сообщение, находится обработчик, который получая (среди множества других) сообщение WM_COPYDATA забирает посланные данные, которые описаны в типе COPYDATASTRUCT.


с ошибками я разобрался.. всюду поставил Private:

Private Type COPYDATASTRUCT
dwData As Long
cbData As Long
lpData As Long
End Type
Private Const WM_COPYDATA = &H4A


Ты посылаешь окну сообщение WM_COPYDATA


как его послать? какой код нужен?

Ответить

Страница: 1 | 2 | 3 | 4 | 5 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам