Что нового

[Интеракция][Окна][Процессы]Работа скрипта как обработчик событий к окну

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Здравствуйте, прошу помощи для "разжевывания" подобной постановки задачи:
Предположим что мы "нацарапаем" окно в библиотеку dll(используя к примеру ЯП PureBasic), вызывать окно мы научились. Но требуется что бы весь, или хотя бы большая часть функционала обработки окна перешла на плечи AutoIt.

Суть вопроса в том как реализовать общение между dll окном и скриптом AutoIt, допустим что после нажатия на кнопку в окне, dll передаст команду скрипту который тот в свою очередь сделает операции которые уже вписаны в функции. Проблема в реализации так называемого "общения", как передавать от dll до AutoIt сведения что бы выполнить ту или иную команду.

Проблема в написании функции интеракции на PureBasic(Передача функциям параметры) реализовывая команды CreateFileMap_() ; MapViewOfFile_() ; OpenFileMapping_()
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
PureBasic
Код:
Global *proc

Procedure Callback(hWnd, uMsg, lParam, wParam)
  Select hWnd
    Case WindowID(0)
      If *proc
        CallFunctionFast(*proc, hWnd, uMsg, lParam, wParam)
      EndIf  
  EndSelect  
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure  

ProcedureDLL GUI(*func)
  If OpenWindow(0, 0, 0, 300, 200, "", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
    *proc = *func
    SetWindowCallback(@Callback())
    ButtonGadget(1, 20, 20, 80, 20, "test")
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          Break
      EndSelect    
    ForEver  
  EndIf
EndProcedure

AutoIt
Код:
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <WinAPIEx.au3>

$tFunc = DllCallbackRegister('Callback', 'ptr', 'hwnd;uint;wparam;lparam')
GUI(DllCallbackGetPtr($tFunc))
DllCallbackFree($tFunc)

Func Callback($hWnd, $uMsg, $wParam, $lParam)
	Switch $uMsg
		Case $WM_COMMAND
			Switch _WinAPI_LoWord($wParam)
				Case 1 ;~ Наша кнопка на окне
					Switch _WinAPI_HiWord($wParam)
						Case $BN_CLICKED
							MsgBox(0, '', 'Button 1')
					EndSwitch
			EndSwitch
	EndSwitch
EndFunc

Func GUI($pFunc)
	DllCall('guipb.dll', 'none', 'GUI', 'ptr', $pFunc)
	If @error Then
		Return 0
	EndIf
    Return 1
EndFunc
 
Автор
MnM

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Viktor1703
Это 2 примера или код PB уже dll, при запуске кода AutoIt окно не появляется
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Код PB компилируешь в dll, ложишь эту dll рядом со скриптом и запускаешь скрипт на AutoIt, прикрепляю dll и скрипт на AutoIt. Хотя код на том и на том яп не очень правильный, просто пример, и интересно зачем это?
 
Автор
MnM

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Извиняюсь, просто при компиляции dll'ке имя не то дал :smile: Спасибо за пример
 
Автор
MnM

MnM

Post-Hardcore
Сообщения
679
Репутация
90
sims сказал(а):
Нет. Его компилировать нужно. Файлы в архиве.
Я спрашивал, код является для компиляции в dll или это консольное приложение :smile:
Viktor1703 сказал(а):
и интересно зачем это?
Ну PB вроде бы как компилируемый, и работает быстрее если сравнивать с GUI у AutoIt, вот и подумал окошечко в dll сунуть(Хотя наверное правильнее было бы сделать с точностью наоборот :smile:)
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
MnM [?]
Ну PB вроде бы как компилируемый, и работает быстрее если сравнивать с GUI у AutoIt, вот и подумал окошечко в dll сунуть(Хотя наверное правильнее было бы сделать с точностью наоборот
smiley.gif
)

Или сразу писать в PB
 
Автор
MnM

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Viktor1703 сказал(а):
Или сразу писать в PB
Вот не поверите, как узнал про функциональность того языка сразу на нем захотел "калякать", но вот не задача с переходом с AutoIt на PB. Всякие преобразования переменных, еще не такое как в Autoit представление бинарных данных. Вобщем долго мне в нем копаться :'(
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
MnM

А чего в нём копаться, просто ставь типы для переменных, в справке всё есть...

Код:
a.l = 3    ; Переменная типа long
b.i = 3    ; переменная типа Int
c.s = "1" ; переменная типа String

Str(a) ; преобразуем переменную типа Long в тип String
Str(b) ; преобразуем переменную типа Int в тип String
Val(c) ; преобразуем переменную типа String в тип Quad
ValD(c) ; преобразуем переменную типа String в тип Double
ValF(c) ; преобразуем переменную типа String в тип Float

Ну и т.д. по PB есть справка почти как в AutoIt, находится в директории вместе с PB.


Добавлено:
Сообщение автоматически объединено:

MnM [?]
еще не такое как в Autoit представление бинарных данных

В каком смысле не такое?
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
MnM [?]
Нуу, например у AutoIt это 0x0... а у PB %... и *... ; @...

У PureBasic будет так $34, * - это указатель например

Код:
var=100 ; Запись числа 100 в переменную
*pointer=@var ; Поучение адреса переменной
Debug PeekC(*pointer) ; покажет 100

символ @ используется для получения адреса переменной, функции, массива, структуры и т.д. в общем есть справка, форумы, онлайн уроки и т.д.
 
Автор
MnM

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Viktor1703 сказал(а):
есть справка, форумы
Ну так я и роюсь там, но часть информации идет все равно по принципу: "В одно ухо влетает... а из другого вылетает=)"
 

sims

Осваивающий
Сообщения
184
Репутация
24
MnM [?]
Я спрашивал, код является для компиляции в dll или это консольное приложение
Тот код можно скомпилировать как оконное или консольное приложение, или dll, но наличие ProcedureDLL намекает что это все таки dll.

[?]
Всякие преобразования переменных
Они выполняются компилятором и в большинстве случаев, достаточно типа по умолчанию (по умолчанию это Integer, но можно изменить оператором Define).
В справке перечислены типы переменных и их размерность (число байт). http://purebasic.com/documentation/reference/variables.html

[?]
Нуу, например у AutoIt это 0x0... а у PB %... и *... ; @...
% это либо деление по модулю, или признак числа, записанного в двоичной системе счисления.
* это переменная - указатель на память. В место нее вполне сгодится переменная типа Integer, кроме случая, указателя на структуру.
@ это получение указателя переменной, процедуры, массива, связанного списка, структуры и т. д. http://pure-basic.narod.ru/docs/point.html
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
MnM
Учти что он платный. Хотя если зарабатывать на нём, то наверно заработаешь быстрее и хватит на то, что бы его купить и ещё останется.
 
Верх