такого точно в книжках по программированию не пишут...
тут я вижу без исходников не обойтись
например у меня подчёркивает ошибкой:
WM_COPYDATA
COPYDATASTRUCT
эти комманды нужно объявить..
и что это за процедура.. приёма?
не могли бы вы на VB.NET выложить 2-а исодника - один отправляет DAta
другой принимает.. так будет вопрос исчерпан
Пожалуйста.
В 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
не могли бы вы на каком-нить языке выложить 2-а исодника - один, который отправляет DAta, а
другой принимает.. так будет вопрос исчерпан
Пожалуйста.
а тоя как я не напишу - одни ошибки..
не могли бы вы на каком-нить языке выложить 2-а исодника - один, который отправляет DAta, а
другой принимает.. так будет вопрос исчерпан
Пожалуйста.
а тоя как я не напишу - одни ошибки..
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 незаконченный, уже кричит, чтобы я его дописал.
хэндл приложения можно получить узнав свойство 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.. только без хэндлов.. и как он работает..
мне важно..рабочий вариант для копания.. и модификации.. отпраки другому приложению.. сообщения.
Но когда ты начинаешь передавать указатели в другие процессы, то в NT системах они теряют силу - т.к. указывают уже не на то, что надо.
Это не из за NT, а из за страничной адресации. У каждого процесса своё адресное пространство. Указатель(по сути адрес) является на самом деле линейным адресом, который представляет из себя запись (или говоря твоим языком структуру) из трёх полей. С помощью регистра CR3 процессор в нулевом кольце переводит линейный адрес в физический. На wasm.ru есть статья на эту тему.
И ничего я не усложняю. 8)
Я же не говорю что нарочно. Наверное чистые Си-программисты все такие
Это не из за NT, а из за страничной адресации. У каждого процесса своё адресное пространство.
Просто я думал, что только в NT-виндах у каждого процесса своя память. Вроде как этим и объясняется её стабильность по сравнению с девятииксовой линейкой, у которой каждый процесс лезет куда хочет.
Я же не говорю что нарочно. Наверное чистые Си-программисты все такие
Дык какой же я чистый - я с vb6 начинал. 8)
И горжусь этим - офигенный язык.
хэндл приложения можно получить узнав свойство Me.hwnd
Me.hWnd - хэндл окна Me.
хэндл - это типа индификатор только чего - не понял, то ли процесса.. или приложения.. или внутри приложения..
Вообще, насколько я понял Рихтера хэндл это то, что индефицирует не только объект с которым производятся действия, но и кучу атрибутов, типа как доступ, либо вызывающий процесс. И нужны они, чтобы по нескольку раз не повторять одни и те же операции. Типа как открываешь ты процесс - тебе выдаётся хэндл, описывающий объект, права, наследуемость и процесс, открывший хэндл. В будущем при работе из этого же процесса тебе надо лишь указать хэндл - винда посмотрит в списке, узнает тебя и разрешит работать.
Только вот хэндлы окон под такое понимание как-то не вписываются... 8(
здесь явно не хватает ссылик Declare на Dll.. и её функцию.
Да нет - описание стуктуры это как описание константы - в принципе оно никак не связано с библиотекой.
Насчёт ошибки с константой - внимательнее читай, что тебе пишет Вася - он ругается на то, что ты объявляешь её публично - переделай на приват, либо засунь в модуль.
я отлично понимаю, с чём едят API..
Ну вот видишь - я уже лишка хватил с объяснениями, а ты говоришь "объясняйте понятнее". 8)
мне важно..рабочий вариант для копания.. и модификации.. отпраки другому приложению.. сообщения.
Как говорилось в фльме "Я - робот":
Извини, в ответах я ограничен - правильно задавай вопросы.
8)
Я к тому, что сейчас, к примеру, я пишу с работы, где у меня нет средств разработки, а я не такой крутой программер, чтобы всё это в блокноте накидать. А дома у меня куча начатых интересных проектов, которыми тоже хочется заняться.
Да и той инфы, что здесь есть вполне хватает для того, чтобы по крайней мере начать. А готовый код тебе мало что даст - к примеру, сейчас у тебя был рабочий код с объявами API-функций, а объявленные тобой функции не хотят работать из-за публичного объявления. Просто потому что ты не попарился с объявами и не выяснил толком как они работают.
Тут разве что сабклассинга нет - но это тема уже весьма заезжена - несложно отыскать.
В 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