PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » IsImage() не работает в DLL, что делать


IsImage() не работает в DLL, что делать

Сообщений 1 страница 6 из 6

1

насколько корректно использовать ImageID() или ImageDepth() которые возвращают
может есть апи функция?, мне найти не удалось

сама dll

Код:
EnableExplicit

ProcedureDLL isImageDLL(im1, im2)
Protected i1, i2, i3, i4, i5, i6, i7, i8, s.s
i1=IsImage(im1)
i2=IsImage(im2)
i3=ImageDepth(im1)
i4=ImageDepth(im2)
i5=ImageFormat(im1)
i6=ImageFormat(im2)
i7=ImageID(im1)
i8=ImageID(im2)
s="i1 - "+i1+#CRLF$+"i2 - "+i2+#CRLF$+"i3 - "+i3+#CRLF$+"i4 - "+i4+#CRLF$
s+"i5 - "+i5+#CRLF$+"i6 - "+i6+#CRLF$+"i7 - "+i7+#CRLF$+"i8 - "+i8+#CRLF$
MessageBox_(0, s, "", #MB_ICONSTOP)
EndProcedure

доступ к dll

Код:

EnableExplicit

ProcedureDLL isImageDLL(im1, im2)
Protected i1, i2
If OpenLibrary(125, "dll-isImage.dll")<>0
CallFunction(125, "isImageDLL", im1, im2)

EndIf
EndProcedure



Procedure senior()
Protected ev, f1, im1, im2
OpenWindow(#PB_Any, 870, 690, 500, 310, "test")


im1 = CreateImage(#PB_Any, 111, 111, 32, #PB_Image_Transparent)
im2 = 123456
isImageDLL(im1, im2)

Repeat
ev=WaitWindowEvent()
If GetAsyncKeyState_(#VK_ESCAPE)=32768:Break:EndIf
Until ev=#PB_Event_CloseWindow

EndProcedure

senior()

0

2

exe и dll это разные исполняемые файлы и у них отдельные менеджеры объектов.

0

3

это понятно, поведение функций разное, в проге вылетает с ошибкой, а dll возвращает или ноль или нормально
делать то что?
неужели нет айпишной функции? но ей понадобится imageId(), тупик получается

0

4

newJS написал(а):

неужели нет айпишной функции?

Есть конечно же. ImageID() вызовите в exe и передайте результат в dll.

0

5

если не картинка ImageID() в экзешнике вызывает ошибку, в dll  возвращает 0

Пётр написал(а):

Есть конечно же. ImageID() вызовите в exe и передайте результат в dll.

то что отправляется в dll оно само собой проверяется в экзешнике
проверять нужно то что генерится в самой dll

отлаженная dll работает, но без защиты это до поры до времени

Пётр написал(а):

Есть конечно же. ImageID()

с каких пор эта функция стала айпишной?

я так понимаю, есть таблица в которой номеру соответствует hwnd
функция просто вытягивает из таблицы нужное, и всё

0

6

Я предлагаю передать указатель на изображение (EncodeImage+CatchImage), а не дескриптор. То есть DLL создаст своё изображение внутри себя из данных по указателю. Может этот вариант будет более защищён, так как объект создаётся свой и не может быть удалён внешней исполняемой программой, а dll оставить с носом.

Код:
Define *ptr

#Image = 0
#Image2 = 1

If OpenWindow(0, 0, 0, 128, 128, "FreeImage", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

    LoadImage(#Image, #PB_Compiler_Home + "Examples\Sources\Data\GeeBee2.bmp")
    If StartDrawing(ImageOutput(#Image))
    	DrawingMode(#PB_2DDrawing_Transparent)
    	DrawText(5, 5, "Я тут написал кое что", $00FF00)
    	StopDrawing()
    EndIf
    *ptr = EncodeImage(#Image, #PB_ImagePlugin_BMP) 
    If CatchImage(#Image2, *ptr)
    	ImageGadget(0, 0, 0, ImageWidth(#Image2), ImageHeight(#Image2), ImageID(#Image2))
    EndIf

    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

0


Вы здесь » PureBasic - форум » PureBasic для Windows » IsImage() не работает в DLL, что делать