Как из процедуры удобнее вернуть 5-6 параметров. У меня на ум приходит извращенный метод. Переслать их в строке типа: 67 55 44 88 22 . А потом считать с помощью MID. Плохо что нельзя вернуть массив, это был бы лучший вариант.
Процедуры
Сообщений 1 страница 30 из 39
Поделиться208.03.2010 18:05:28
Как из процедуры удобнее вернуть 5-6 параметров
Как вариант, передать процедуре указатель на структуру и заполнить её возвращаемыми данными.
Structure Proba x.l y.l Text.s z.l EndStructure x.Proba Procedure Proba(*x.Proba) *x\x=10 *x\y=20 *x\Text="Строка текста" *x\z=100 EndProcedure Proba(@x) Debug x\x Debug x\y Debug x\Text Debug x\z
Плохо что нельзя вернуть массив, это был бы лучший вариант
Всё можно.
Dim proba(10) Procedure ProbaArray(Array proba(1)) For i=0 To 10 proba(i)=i Next i EndProcedure ProbaArray(proba()) For i=0 To 10 Debug proba(i) Next i
Поделиться308.03.2010 18:15:43
Я забыл в вопросе указать из ProcedureDLL. Первый вариант похоже подойдет. Не знаю только не потрутся данные структуры после завершения DLL. То есть я хочу себе сделать библиотечку.
Отредактировано haav (08.03.2010 18:18:43)
Поделиться408.03.2010 18:21:25
Первый вариант похоже подойдет. Не знаю только не потрутся данные структуры после завершения DLL
Нет не потрутся.
Дело в том, что это будет структура не DLLки, а основной проги.
Да и поидее и с массивом должно получится, но проверять нужно. Ведь процедуре передаётся не сам массив, а лишь указать на него. Попробуй.
Размер массива узнаём так:
size=ArraySize(proba())
Поделиться508.03.2010 20:03:40
Че то я запутался, да и вообще код с метками еще мало понимаю. Вот это как я понял надо в DLL
Structure Proba x.l y.l Text.s z.l EndStructure x.Proba Procedure Proba(*x.Proba) *x\x=10 *x\y=20 *x\Text="Строка текста" *x\z=100 EndProcedure
Надо возращать адрес? Типа так ?
procedurereturn x
А в коде:
Proba(@x) Debug x\x Debug x\y Debug x\Text
Ругается компилятор. Я просто недопонимаю.
Debug x\z
Поделиться608.03.2010 20:22:22
Че то я запутался, да и вообще код с метками еще мало понимаю
О каких метках идёт речь?
Надо возращать адрес? Типа так ?
Зачем? Адрес мы уже знаем.
Ругается компилятор.
Что пишет?
Вот код DLLки.
Structure Proba x.l y.l Text.s z.l EndStructure ProcedureDLL Proba(*x.Proba) *x\x=10 *x\y=20 *x\Text="Строка текста" *x\z=100 EndProcedure
Вот её вызов
Structure Proba x.l y.l Text.s z.l EndStructure x.Proba If OpenLibrary(1,"DLL.dll") CallFunction(1,"Proba",@x) Debug x\x Debug x\y Debug x\Text Debug x\z EndIf
Поделиться708.03.2010 20:37:41
Во блин я в коде структуру не задавал, думал что она автоматом из DLL подгружается. Вот у меня и ругался на неизвестную структуру.
О каких метках идёт речь?
Этим я считаю адрес вызова.
То есть это своеобразная метка в памяти на которую прыгает прога.
Поделиться808.03.2010 20:42:57
Все работает спасибо! Файлы уж я не скачивал, код твой скопировал и попробовал.
Поделиться909.03.2010 00:01:19
Этим я считаю адрес вызова
Это называется указателем (Pointer).
Указателем на обрасть памяти.
Поделиться1013.03.2010 15:04:57
Вроде все делал как у тебя, вообще ничего не понимаю
Вот код DLL:
Structure ba
x.f
y.f
width.f
height.f
EndStructure
Structure ban
tx.f
ty.f
twidth.f
theight.f
EndStructure
Global *rrrrr.ban
ProcedureDLL razmer(*u.ba)
*u\x=*rrrrr\tx
*u\y=*rrrrr\ty
*u\y=*rrrrr\twidth
*u\height=*rrrrr\theight
EndProcedure
Procedure OnMouseSelection(fffffff,x_x,y_y,width_x,height_y)
*rrrrr\tx=x_x
*rrrrr\ty=y_y
*rrrrr\twidth=width_x
*rrrrr\theight=height_y
razmer(*rrrrr.ban)
EndProcedure
Procedure DrawMouseSelector(fffffff)
nnp=0
Shared WindowProc_MouseSelectStartX, WindowProc_MouseSelectLastX
Shared WindowProc_MouseSelectStartY, WindowProc_MouseSelectLastY
Shared WindowProc_MouseSelectRect.RECT
If WindowProc_MouseSelectStartX > WindowProc_MouseSelectLastX
WindowProc_MouseSelectRect\left = WindowProc_MouseSelectLastX
WindowProc_MouseSelectRect\right = WindowProc_MouseSelectStartX
Else
WindowProc_MouseSelectRect\left = WindowProc_MouseSelectStartX
WindowProc_MouseSelectRect\right = WindowProc_MouseSelectLastX
EndIf
If WindowProc_MouseSelectStartY > WindowProc_MouseSelectLastY
WindowProc_MouseSelectRect\top = WindowProc_MouseSelectLastY
WindowProc_MouseSelectRect\bottom = WindowProc_MouseSelectStartY
Else
WindowProc_MouseSelectRect\top = WindowProc_MouseSelectStartY
WindowProc_MouseSelectRect\bottom = WindowProc_MouseSelectLastY
EndIf
hDC = GetDC_(fffffff)
;InvertRect_(hDC,@WindowProc_MouseSelectRect) ; изменяет пиксели( инвертирует)
DrawFocusRect_(hDC,@WindowProc_MouseSelectRect) ;Функция DrawFocusRect использует операцию XOR при рисовании - таким образом вывод прямоугольника дважды с одними и теми же координатами стирает прямоугольник, и прямоугольник всегда будет виден, на фоне какого бы цвета он не выводился.
ReleaseDC_(fffffff,hDC)
EndProcedure
Procedure WindowProc(fffffff,Msg,wParam,lParam)
Shared WindowProc_MouseSelect
Shared WindowProc_MouseSelectStartX, WindowProc_MouseSelectLastX
Shared WindowProc_MouseSelectStartY, WindowProc_MouseSelectLastY
Shared WindowProc_MouseSelectRect.RECT
Select Msg
Case #WM_LBUTTONDOWN
WindowProc_MouseSelect = 1
WindowProc_MouseSelectStartX = lParam&$FFFF ; определяют любое расстояние по оси Х (без нее все время будет от нуля)
WindowProc_MouseSelectStartY = (lParam>>16)&$FFFF ; определяют любое расстояние по оси Y (без нее все время будет от нуля)
GetClientRect_(fffffff,winrect.RECT)
MapWindowPoints_(fffffff,0,winrect,2) ;преобразует (отображает) ряд точек относительно координатного пространства одного окна относительно координатного пространства другого окна.
ClipCursor_(winrect) ;ограничитель курсора в рамке окна
ProcedureReturn 0
Case #WM_LBUTTONUP
If WindowProc_MouseSelect > 1
DrawMouseSelector(fffffff) ; отлючив ее инвертация(изображение) остается
If WindowProc_MouseSelectRect\left <> WindowProc_MouseSelectRect\right And WindowProc_MouseSelectRect\top <> WindowProc_MouseSelectRect\bottom
OnMouseSelection(fffffff,WindowProc_MouseSelectRect\left,WindowProc_MouseSelectRect\top,WindowProc_MouseSelectRect\right-WindowProc_MouseSelectRect\left,WindowProc_MouseSelectRect\bottom-WindowProc_MouseSelectRect\top)
SetCapture_(0) ;устанавливает захват мыши в заданном окне, принадлежащем текущему потоку.
EndIf
EndIf
ClipCursor_(0)
WindowProc_MouseSelect = 0
ProcedureReturn 0
Case #WM_MOUSEMOVE
If WindowProc_MouseSelect > 0 And wParam & #MK_LBUTTON
If WindowProc_MouseSelect > 1
DrawMouseSelector(fffffff)
Else
WindowProc_MouseSelect + 1
EndIf
WindowProc_MouseSelectLastX = lParam&$FFFF
WindowProc_MouseSelectLastY = (lParam>>16)&$FFFF
DrawMouseSelector(fffffff)
SetCapture_(fffffff)
EndIf
ProcedureReturn 0
EndSelect
old=GetWindowLong_(fffffff,#GWL_USERDATA) ;извлекает информацию об определяемом окне.
If old
ProcedureReturn CallWindowProc_(old,fffffff,Msg,wParam,lParam) ; передает информацию сообщения процедуре заданного окна.
Else
DefWindowProc_(fffffff,Msg,wParam,lParam) ;Функция DefWindowProc вызывается оконной процедурой по умолчанию, чтобы обеспечить обработку по умолчанию любого сообщения окна, которые приложение не обрабатывает. Эта функция гарантирует то, что обрабатывается каждое сообщение. Функция DefWindowProc вызывается с теми же самыми параметрами, принятыми оконной процедурой.
EndIf
EndProcedure
ProcedureDLL SelectorImage(a)
old = SetWindowLong_(a,#GWL_WNDPROC,@WindowProc()) ; Устанавливает информацию для окна
SetWindowLong_(a,#GWL_USERDATA,old)
ProcedureReturn old
EndProcedure
ProcedureDLL SelectorFreeImage(a, old)
SetWindowLong_(a,#GWL_WNDPROC,old) ; Устанавливает информацию для окна
EndProcedureВот код EXE:
Structure ba
x.l
y.l
width.l
height.l
EndStructure
Global u.ba
If OpenLibrary(1,"DLLCUR.dll")<>0
dll=1
EndIf
Procedure vv()
CallFunction(1,"razmer",@u)
If u\x<>0 Or u\y<>0 Or u\width<>0 Or u\height<>0
Debug u\x
Debug u\y
Debug u\width
Debug u\height
EndIf
EndProcedure
If LoadImage(1,"FEN.bmp")
Else
End
EndIf
If OpenWindow(0,100,100,500,500,"")
ImageGadget(0,0,0,500,500,ImageID(1))
gad=GadgetID(0)
EndIf
CallFunction(1,"SelectorImage",gad)
Repeat
ev=WaitWindowEvent()
If dll=1
vv()
EndIf
Until ev=16
CallFunction(1,"SelectorFreeImage",gad,old)
CloseLibrary(1)Вываливается ошибка и все тут. 
Поделиться1113.03.2010 15:33:31
Structure ba
x.f
y.f
width.f
height.f
EndStructureStructure ban
tx.f
ty.f
twidth.f
theight.f
EndStructure
Зачем две одинаковые структуры, да ещё и с флоатными переменными?
Тут нужен тип LONG.
Да и побольшому счёту, можно было-бы использовать готовую структуру RECT и не изобретать колесо.
Теперь о том, почему не работало.
Вот сравни этот код, с твоим и найди отличия.
Structure ba x.l y.l width.l height.l EndStructure Global rrrrr.ba ProcedureDLL razmer(*u.ba) *u\x=rrrrr\x *u\y=rrrrr\y *u\y=rrrrr\width *u\height=rrrrr\height EndProcedure Procedure OnMouseSelection(fffffff,x_x,y_y,width_x,height_y) rrrrr\x=x_x rrrrr\y=y_y rrrrr\width=width_x rrrrr\height=height_y razmer(@rrrrr) EndProcedure
.
DLLка
Structure ba
x.l
y.l
width.l
height.l
EndStructure
Global rrrrr.ba
ProcedureDLL razmer(*u.ba)
*u\x=rrrrr\x
*u\y=rrrrr\y
*u\y=rrrrr\width
*u\height=rrrrr\height
EndProcedure
Procedure OnMouseSelection(fffffff,x_x,y_y,width_x,height_y)
rrrrr\x=x_x
rrrrr\y=y_y
rrrrr\width=width_x
rrrrr\height=height_y
razmer(@rrrrr)
EndProcedure
Procedure DrawMouseSelector(fffffff)
nnp=0
Shared WindowProc_MouseSelectStartX, WindowProc_MouseSelectLastX
Shared WindowProc_MouseSelectStartY, WindowProc_MouseSelectLastY
Shared WindowProc_MouseSelectRect.RECT
If WindowProc_MouseSelectStartX > WindowProc_MouseSelectLastX
WindowProc_MouseSelectRect\left = WindowProc_MouseSelectLastX
WindowProc_MouseSelectRect\right = WindowProc_MouseSelectStartX
Else
WindowProc_MouseSelectRect\left = WindowProc_MouseSelectStartX
WindowProc_MouseSelectRect\right = WindowProc_MouseSelectLastX
EndIf
If WindowProc_MouseSelectStartY > WindowProc_MouseSelectLastY
WindowProc_MouseSelectRect\top = WindowProc_MouseSelectLastY
WindowProc_MouseSelectRect\bottom = WindowProc_MouseSelectStartY
Else
WindowProc_MouseSelectRect\top = WindowProc_MouseSelectStartY
WindowProc_MouseSelectRect\bottom = WindowProc_MouseSelectLastY
EndIf
hDC = GetDC_(fffffff)
;InvertRect_(hDC,@WindowProc_MouseSelectRect) ; изменяет пиксели( инвертирует)
DrawFocusRect_(hDC,@WindowProc_MouseSelectRect) ;Функция DrawFocusRect использует операцию XOR при рисовании - таким образом вывод прямоугольника дважды с одними и теми же координатами стирает прямоугольник, и прямоугольник всегда будет виден, на фоне какого бы цвета он не выводился.
ReleaseDC_(fffffff,hDC)
EndProcedure
Procedure WindowProc(fffffff,Msg,wParam,lParam)
Shared WindowProc_MouseSelect
Shared WindowProc_MouseSelectStartX, WindowProc_MouseSelectLastX
Shared WindowProc_MouseSelectStartY, WindowProc_MouseSelectLastY
Shared WindowProc_MouseSelectRect.RECT
Select Msg
Case #WM_LBUTTONDOWN
WindowProc_MouseSelect = 1
WindowProc_MouseSelectStartX = lParam&$FFFF ; определяют любое расстояние по оси Х (без нее все время будет от нуля)
WindowProc_MouseSelectStartY = (lParam>>16)&$FFFF ; определяют любое расстояние по оси Y (без нее все время будет от нуля)
GetClientRect_(fffffff,winrect.RECT)
MapWindowPoints_(fffffff,0,winrect,2) ;преобразует (отображает) ряд точек относительно координатного пространства одного окна относительно координатного пространства другого окна.
ClipCursor_(winrect) ;ограничитель курсора в рамке окна
ProcedureReturn 0
Case #WM_LBUTTONUP
If WindowProc_MouseSelect > 1
DrawMouseSelector(fffffff) ; отлючив ее инвертация(изображение) остается
If WindowProc_MouseSelectRect\left <> WindowProc_MouseSelectRect\right And WindowProc_MouseSelectRect\top <> WindowProc_MouseSelectRect\bottom
OnMouseSelection(fffffff,WindowProc_MouseSelectRect\left,WindowProc_MouseSelectRect\top,WindowProc_MouseSelectRect\right-WindowProc_MouseSelectRect\left,WindowProc_MouseSelectRect\bottom-WindowProc_MouseSelectRect\top)
SetCapture_(0) ;устанавливает захват мыши в заданном окне, принадлежащем текущему потоку.
EndIf
EndIf
ClipCursor_(0)
WindowProc_MouseSelect = 0
ProcedureReturn 0
Case #WM_MOUSEMOVE
If WindowProc_MouseSelect > 0 And wParam & #MK_LBUTTON
If WindowProc_MouseSelect > 1
DrawMouseSelector(fffffff)
Else
WindowProc_MouseSelect + 1
EndIf
WindowProc_MouseSelectLastX = lParam&$FFFF
WindowProc_MouseSelectLastY = (lParam>>16)&$FFFF
DrawMouseSelector(fffffff)
SetCapture_(fffffff)
EndIf
ProcedureReturn 0
EndSelect
old=GetWindowLong_(fffffff,#GWL_USERDATA) ;извлекает информацию об определяемом окне.
If old
ProcedureReturn CallWindowProc_(old,fffffff,Msg,wParam,lParam) ; передает информацию сообщения процедуре заданного окна.
Else
DefWindowProc_(fffffff,Msg,wParam,lParam) ;Функция DefWindowProc вызывается оконной процедурой по умолчанию, чтобы обеспечить обработку по умолчанию любого сообщения окна, которые приложение не обрабатывает. Эта функция гарантирует то, что обрабатывается каждое сообщение. Функция DefWindowProc вызывается с теми же самыми параметрами, принятыми оконной процедурой.
EndIf
EndProcedure
ProcedureDLL SelectorImage(a)
old = SetWindowLong_(a,#GWL_WNDPROC,@WindowProc()) ; Устанавливает информацию для окна
SetWindowLong_(a,#GWL_USERDATA,old)
ProcedureReturn old
EndProcedure
ProcedureDLL SelectorFreeImage(a, old)
SetWindowLong_(a,#GWL_WNDPROC,old) ; Устанавливает информацию для окна
EndProcedureПрога.
Structure ba
x.l
y.l
width.l
height.l
EndStructure
Global u.ba
If OpenLibrary(1,"E:\DLLCUR.dll")<>0
dll=1
EndIf
Procedure vv()
CallFunction(1,"razmer",@u)
If u\x<>0 Or u\y<>0 Or u\width<>0 Or u\height<>0
Debug u\x
Debug u\y
Debug u\width
Debug u\height
EndIf
EndProcedure
If LoadImage(1,"FEN.bmp")
Else
End
EndIf
If OpenWindow(0,100,100,500,500,"")
ImageGadget(0,0,0,500,500,ImageID(1))
gad=GadgetID(0)
EndIf
old=CallFunction(1,"SelectorImage",gad)
Repeat
ev=WaitWindowEvent()
If dll=1
vv()
EndIf
Until ev=16
CallFunction(1,"SelectorFreeImage",gad,old)
CloseLibrary(1)Поделиться1213.03.2010 15:54:35
Зачем две одинаковые структуры, да ещё и с флоатными переменными?
Тут нужен тип LONG.
Изначально он у меня и был, это я потом начал слепо все менять от безысходности. Я понял ошибку, спасибо.
Поделиться1313.03.2010 16:08:44
А из DLL можно вызывать функцию находящуюся в файле EXE? Это я к тому, чтобы вообще обойтись без моих структур.
Поделиться1413.03.2010 16:34:03
А из DLL можно вызывать функцию находящуюся в файле EXE?
Теоритически да, но нужно проверить. Я так делал, правда, в библиотеке для пурика XP_Menu_Lib в функции XP_SetSideText_CB.
DLLке передаёшь указатель на процедуру основной проги (указатель получаем с помощью собаки).
В DLLке вызываем процедуру по указателю с помощью CallFunctionFast.
Это я к тому, чтобы вообще обойтись без моих структур.
А какая связь между вызовом процедуры основной проги и структурами?
Поделиться1513.03.2010 16:40:39
А какая связь между вызовом процедуры основной проги и структурами?
В кодах выше для того чтобы узнать размеры выделяемой области, надо посылать постоянно запрос в процедуру. Отсюда все мои вопросы и были. С другой стороны если есть возможность посылать прямо из dll в exe, когда выделение сделано, это и быстрее и продуктивнее мне кажется.
Поделиться1613.03.2010 16:49:51
Вроде работает.
DLL
Structure ba
x.l
y.l
width.l
height.l
EndStructure
Global rrrrr.ba, *ProcPoint
ProcedureDLL razmer(*u.ba)
*u\x=rrrrr\x
*u\y=rrrrr\y
*u\y=rrrrr\width
*u\height=rrrrr\height
EndProcedure
Procedure OnMouseSelection(fffffff,x_x,y_y,width_x,height_y)
;rrrrr\x=x_x
;rrrrr\y=y_y
;rrrrr\width=width_x
;rrrrr\height=height_y
;razmer(@rrrrr)
If *ProcPoint
CallFunctionFast(*ProcPoint,x_x,y_y,width_x,height_y)
EndIf
EndProcedure
Procedure DrawMouseSelector(fffffff)
nnp=0
Shared WindowProc_MouseSelectStartX, WindowProc_MouseSelectLastX
Shared WindowProc_MouseSelectStartY, WindowProc_MouseSelectLastY
Shared WindowProc_MouseSelectRect.RECT
If WindowProc_MouseSelectStartX > WindowProc_MouseSelectLastX
WindowProc_MouseSelectRect\left = WindowProc_MouseSelectLastX
WindowProc_MouseSelectRect\right = WindowProc_MouseSelectStartX
Else
WindowProc_MouseSelectRect\left = WindowProc_MouseSelectStartX
WindowProc_MouseSelectRect\right = WindowProc_MouseSelectLastX
EndIf
If WindowProc_MouseSelectStartY > WindowProc_MouseSelectLastY
WindowProc_MouseSelectRect\top = WindowProc_MouseSelectLastY
WindowProc_MouseSelectRect\bottom = WindowProc_MouseSelectStartY
Else
WindowProc_MouseSelectRect\top = WindowProc_MouseSelectStartY
WindowProc_MouseSelectRect\bottom = WindowProc_MouseSelectLastY
EndIf
hDC = GetDC_(fffffff)
;InvertRect_(hDC,@WindowProc_MouseSelectRect) ; изменяет пиксели( инвертирует)
DrawFocusRect_(hDC,@WindowProc_MouseSelectRect) ;Функция DrawFocusRect использует операцию XOR при рисовании - таким образом вывод прямоугольника дважды с одними и теми же координатами стирает прямоугольник, и прямоугольник всегда будет виден, на фоне какого бы цвета он не выводился.
ReleaseDC_(fffffff,hDC)
EndProcedure
Procedure WindowProc(fffffff,Msg,wParam,lParam)
Shared WindowProc_MouseSelect
Shared WindowProc_MouseSelectStartX, WindowProc_MouseSelectLastX
Shared WindowProc_MouseSelectStartY, WindowProc_MouseSelectLastY
Shared WindowProc_MouseSelectRect.RECT
Select Msg
Case #WM_LBUTTONDOWN
WindowProc_MouseSelect = 1
WindowProc_MouseSelectStartX = lParam&$FFFF ; определяют любое расстояние по оси Х (без нее все время будет от нуля)
WindowProc_MouseSelectStartY = (lParam>>16)&$FFFF ; определяют любое расстояние по оси Y (без нее все время будет от нуля)
GetClientRect_(fffffff,winrect.RECT)
MapWindowPoints_(fffffff,0,winrect,2) ;преобразует (отображает) ряд точек относительно координатного пространства одного окна относительно координатного пространства другого окна.
ClipCursor_(winrect) ;ограничитель курсора в рамке окна
ProcedureReturn 0
Case #WM_LBUTTONUP
If WindowProc_MouseSelect > 1
DrawMouseSelector(fffffff) ; отлючив ее инвертация(изображение) остается
If WindowProc_MouseSelectRect\left <> WindowProc_MouseSelectRect\right And WindowProc_MouseSelectRect\top <> WindowProc_MouseSelectRect\bottom
OnMouseSelection(fffffff,WindowProc_MouseSelectRect\left,WindowProc_MouseSelectRect\top,WindowProc_MouseSelectRect\right-WindowProc_MouseSelectRect\left,WindowProc_MouseSelectRect\bottom-WindowProc_MouseSelectRect\top)
SetCapture_(0) ;устанавливает захват мыши в заданном окне, принадлежащем текущему потоку.
EndIf
EndIf
ClipCursor_(0)
WindowProc_MouseSelect = 0
ProcedureReturn 0
Case #WM_MOUSEMOVE
If WindowProc_MouseSelect > 0 And wParam & #MK_LBUTTON
If WindowProc_MouseSelect > 1
DrawMouseSelector(fffffff)
Else
WindowProc_MouseSelect + 1
EndIf
WindowProc_MouseSelectLastX = lParam&$FFFF
WindowProc_MouseSelectLastY = (lParam>>16)&$FFFF
DrawMouseSelector(fffffff)
SetCapture_(fffffff)
EndIf
ProcedureReturn 0
EndSelect
old=GetWindowLong_(fffffff,#GWL_USERDATA) ;извлекает информацию об определяемом окне.
If old
ProcedureReturn CallWindowProc_(old,fffffff,Msg,wParam,lParam) ; передает информацию сообщения процедуре заданного окна.
Else
DefWindowProc_(fffffff,Msg,wParam,lParam) ;Функция DefWindowProc вызывается оконной процедурой по умолчанию, чтобы обеспечить обработку по умолчанию любого сообщения окна, которые приложение не обрабатывает. Эта функция гарантирует то, что обрабатывается каждое сообщение. Функция DefWindowProc вызывается с теми же самыми параметрами, принятыми оконной процедурой.
EndIf
EndProcedure
ProcedureDLL SelectorImage(a, *Proc_Point)
*ProcPoint=*Proc_Point
old = SetWindowLong_(a,#GWL_WNDPROC,@WindowProc()) ; Устанавливает информацию для окна
SetWindowLong_(a,#GWL_USERDATA,old)
ProcedureReturn old
EndProcedure
ProcedureDLL SelectorFreeImage(a, old)
SetWindowLong_(a,#GWL_WNDPROC,old) ; Устанавливает информацию для окна
EndProcedureEXE
Structure ba
x.l
y.l
width.l
height.l
EndStructure
Global u.ba
If OpenLibrary(1,"E:\DLLCUR.dll")<>0
dll=1
EndIf
Procedure vv()
CallFunction(1,"razmer",@u)
If u\x<>0 Or u\y<>0 Or u\width<>0 Or u\height<>0
Debug u\x
Debug u\y
Debug u\width
Debug u\height
EndIf
EndProcedure
Procedure DLL_Proc(x_x,y_y,width_x,height_y)
Debug x_x
Debug y_y
Debug width_x
Debug height_y
EndProcedure
If LoadImage(1,"FEN.bmp")
Else
End
EndIf
If OpenWindow(0,100,100,500,500,"")
ImageGadget(0,0,0,500,500,ImageID(1))
gad=GadgetID(0)
EndIf
old=CallFunction(1,"SelectorImage",gad, @DLL_Proc())
Repeat
ev=WaitWindowEvent()
If dll=1
; vv()
EndIf
Until ev=16
CallFunction(1,"SelectorFreeImage",gad,old)
CloseLibrary(1)Поделиться1713.03.2010 17:05:24
Вроде работает.
А у меня после выделения области сразу закрывается окно, но приложение работает. Кстати а где ты тут отправил адрес процедуры? Я попробовал что то типа @ffff в качестве параметра передать, но прога вылетает. конечно перед этим создал процедуру ffff
Отредактировано haav (13.03.2010 17:19:11)
Поделиться1813.03.2010 17:22:51
а где ты тут отправил адрес процедуры
Вот
old=CallFunction(1,"SelectorImage",gad, @DLL_Proc())
Я попробовал что то типа @ffff в качестве параметра передать, но прога вылетает
Скобки надо было ставить, типа @ffff(), а иначе, компилятор считал что нужно определить адрес переменной ffff
Поделиться1913.03.2010 17:31:39
Теперь все работает, хороший урок. Спасибо Петр, а куда теперь DLL то выложить? Вещь то нужная, новичкам конечно в большей степени.
Поделиться2013.03.2010 17:35:45
Ну сюда выложи.
Поделиться2113.03.2010 18:10:23
Готовая к применению библиотека для работы с выделением нужной области на изображении в заданном окне:
А это пример ее использования:
; Пример использования библиотеки DLLCUR.dll
; Библиотека создана Высочанским Пётром
; Библиотека может быть использована для различных фоторедакторов.
; Функция библиотеки: выделение области в заданном изображении и вывод размеров выделения.
If OpenLibrary(1,"DLLCUR.dll")=0
End
EndIf
Procedure DLL_Proc(x_x,y_y,width_x,height_y)
Debug x_x
Debug y_y
Debug width_x
Debug height_y
EndProcedure
If LoadImage(1,"FEN.bmp") ; ФОТО поставьте свое
Else
End
EndIf
If OpenWindow(0,100,100,500,500,"")
ImageGadget(0,0,0,500,500,ImageID(1))
gad=GadgetID(0)
EndIf
old=CallFunction(1,"SelectorImage",gad, @DLL_Proc())
Repeat
ev=WaitWindowEvent()
Until ev=16
CallFunction(1,"SelectorFreeImage",gad,old)
CloseLibrary(1)Поделиться2219.03.2010 13:39:22
В архиве два кода: 1 для создания DLL, 2 для EXE. Что может быть там не правильно, почему не вызывается DLL ?
Поделиться2319.03.2010 13:58:00
DLL то вызывается, только вот зачем запихивать полноценную программу в DLLку?
DLLки не для этого предназначены.
Поделиться2419.03.2010 14:07:12
DLL то вызывается, только вот зачем запихивать полноценную программу в DLLку?DLLки не для этого предназначены.
То есть как вызывается? У меня на первой строчке виснет, при открытии библиотеки. Что касается для чего в DLL, то у меня это часть программы, я решил ее из блоков DLL собирать
Поделиться2519.03.2010 14:21:52
У меня на первой строчке виснет, при открытии библиотеки
Винет на
ss=CallFunction(0, "RUL", 10000)
Да и по большому счёту, это не зависание, а всего лишь передача управления DLLке.
Только вот окна в DLLках не отображаются, точнее, код работает не корректно!
Но вот если окно создать на чистом API, то оно отображается.
Поделиться2619.03.2010 14:35:41
Но вот если окно создать на чистом API, то оно отображается.
То есть половину кода переписывать на API?
Или только строку openwindow() ?
Поделиться2719.03.2010 14:48:33
То есть половину кода переписывать на API?
Почти всё писать на API
Поделиться2819.03.2010 17:41:54
Почти всё писать на API
Ну нафиг
. Сделаю лучше исполняемый файл и через командную строку параметр(структуру) перешлю.
Поделиться2919.03.2010 18:20:33
через командную строку параметр(структуру) перешлю
И операционка "обрадует" сообщением что прога выполнила не допустимую операцию и будет закрыта....
Поделиться3019.03.2010 18:28:34
Да сейчас попробовал:
А почему память не может быть прочитана, ведь я вызывал ее по правильному адресу?
Enumeration
#Window_0
EndEnumeration
Procedure Open_Window_0()
If OpenWindow(#Window_0, 216, 0, 600, 600, "New window ( 0 )", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar)
EndIf
EndProcedure
Procedure dll_3(a)
MessageRequester("",Str(a))
EndProcedure
Open_Window_0()
RunProgram("1.exe",Str(@dll_3),"")
Repeat
ev=WaitWindowEvent()
Until ev=#PB_Event_CloseWindowэто отправка по адресу:
d.s=ProgramParameter(0)
MessageRequester("", d)
*ee=Val(d.s)
CallFunctionFast(*ee,12000)