purebasic.info

PureBasic forum
Текущее время: Пн май 20, 2019 3:47 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 61 ]  На страницу 1, 2, 3, 4, 5  След.
Автор Сообщение
 Заголовок сообщения: Как в DLL засунуть картинки PNG
СообщениеДобавлено: Ср апр 24, 2019 5:30 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 809
Благодарил (а): 81 раз.
Поблагодарили: 23 раз.
Пункты репутации: 5
у ICO слишком вес большой, ICO то не пакуется, нужна прозрачность
картинок около 80 штук, в пнг около 7 метров весят

длл чтобы было доступно из других языков


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как в DLL засунуть картинки PNG
СообщениеДобавлено: Ср апр 24, 2019 6:24 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6515
Благодарил (а): 28 раз.
Поблагодарили: 213 раз.
Пункты репутации: 57
Чтобы и для других языков, то наверно только через ресурсы.
Создавай файл ресурсов .RES или .RC со своими картинками и подключай в компиляторе к своей DLL

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как в DLL засунуть картинки PNG
СообщениеДобавлено: Ср апр 24, 2019 8:49 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 465
Благодарил (а): 33 раз.
Поблагодарили: 52 раз.
Пункты репутации: 0
можно bat-файлом и ResHacker.exe
Код:
1
2
set "name=my_dll"
"%~dp0ResHacker.exe" -modify "%~dp0%name%.dll", "%~dp0%name%.dll", "%~dp0%name%.res", ,,


или так
Код:
1
2
3
4
5
6
7
8
9
10
 [FILENAMES]
 Exe=my_dll.dll
 SaveAs=my_dll.dll
 Log=my_dll.log
 
[COMMANDS]
-addoverwrite 0.ico, IconGroup,1,
-addoverwrite 1.ico, IconGroup,2,
-addoverwrite 2.ico, IconGroup,3,
-addoverwrite 3.ico, IconGroup,4,


Код:
1
2
3
4
5
color 3b
echo.
 
"%~dp0ResHacker.exe" -script my_dll_modify_script.txt
pause


Справка ResHacker (в том числе по командам)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как в DLL засунуть картинки PNG
СообщениеДобавлено: Чт апр 25, 2019 6:30 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 809
Благодарил (а): 81 раз.
Поблагодарили: 23 раз.
Пункты репутации: 5
у меня длл создаётся странно, в ней нет моих функций, только эти
Цитата:
Адрес: ( 701A13E0 ) -- имя функции: WEP
Адрес: ( 701A118A ) -- имя функции: cdtAnimate
Адрес: ( 701A1813 ) -- имя функции: cdtDraw
Адрес: ( 701A14F3 ) -- имя функции: cdtDrawExt
Адрес: ( 701A13E6 ) -- имя функции: cdtInit
Адрес: ( 701A138B ) -- имя функции: cdtTerm

раньше делал на 531 версии, и всё работало, а 560 вот такое вытворяет, пытаюсь пример из кодархива сделать
я что то делаю не так? вроде всё по инструкции


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как в DLL засунуть картинки PNG
СообщениеДобавлено: Вс апр 28, 2019 4:53 am 
Не в сети
док
Аватар пользователя

Зарегистрирован: Сб мар 28, 2015 11:06 pm
Сообщений: 175
Откуда: Україна
Благодарил (а): 12 раз.
Поблагодарили: 16 раз.
Пункты репутации: 9
такое придумал, но ток под пурик
image.dll
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
DataSection
  IconStart:
 IncludeBinary "CdPlayer.ico"
  IconEnd:
 
  BitmapStart:
 IncludeBinary "PureBasic.bmp"
  BitmapEnd:
 
  PngStart:
 IncludeBinary "PureBasic3DLogo.png"
  PngEnd:
EndDataSection
 
ProcedureDLL GetImage(id)
  Select id
    Case 1
      ProcedureReturn ?IconStart
    Case 2
      ProcedureReturn ?BitmapStart
    Case 3
      ProcedureReturn ?PngStart
    Default
      ProcedureReturn 0
  EndSelect
EndProcedure



example
Код:
1
2
3
4
5
6
7
8
9
UsePNGImageDecoder()
If OpenLibrary(0, "image.dll")
  For i = 1 To 3
    CatchImage(#PB_Any, CallFunction(0, "GetImage", i))
  Next
  ShowLibraryViewer("Image", 0)
  CallDebugger
EndIf
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как в DLL засунуть картинки PNG
СообщениеДобавлено: Вс апр 28, 2019 5:42 am 
Не в сети
док
Аватар пользователя

Зарегистрирован: Сб мар 28, 2015 11:06 pm
Сообщений: 175
Откуда: Україна
Благодарил (а): 12 раз.
Поблагодарили: 16 раз.
Пункты репутации: 9
newJS писал(а):
у меня длл создаётся странно, в ней нет моих функций, только эти

имя твоего файла случайно не Cards.dll? 8)

через .rc -файл


Вложения:
DllRes2.rar [73.28 KiB]
Скачиваний: 28
Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как в DLL засунуть картинки PNG
СообщениеДобавлено: Вс апр 28, 2019 6:36 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 809
Благодарил (а): 81 раз.
Поблагодарили: 23 раз.
Пункты репутации: 5
LinXP писал(а):
имя твоего файла случайно не Cards.dll?

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

за примеры спасибо, попробую
а можно коменты по русски, переводчиком то я переведу....

тоже пробовал через ресурс, но так как длл отказалась генериться, то и попробовать не удалось


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как в DLL засунуть картинки PNG
СообщениеДобавлено: Вс апр 28, 2019 8:53 am 
Не в сети
док
Аватар пользователя

Зарегистрирован: Сб мар 28, 2015 11:06 pm
Сообщений: 175
Откуда: Україна
Благодарил (а): 12 раз.
Поблагодарили: 16 раз.
Пункты репутации: 9
newJS писал(а):
а можно коменты по русски, переводчиком то я переведу....

ну код я отсюда скопипасатил https://www.purebasic.fr/english/viewto ... 13&t=71021 и добавил hlibMain = LoadLibrary_("resource.dll") если не указывать - то будет пытаться грузить ресурсы из основного файла
а почитать можно и тут http://vsokovikov.narod.ru/New_MSDN_API ... ibrary.htm http://vsokovikov.narod.ru/New_MSDN_API ... source.htm

зы: вот тут ещё интересный примерчик использования LoadMenu_ и LoadIcon_ но пока нет времени попробовать
https://www.purebasic.fr/english/viewto ... =5&t=18959


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как в DLL засунуть картинки PNG
СообщениеДобавлено: Вс апр 28, 2019 7:27 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 827
Благодарил (а): 2 раз.
Поблагодарили: 38 раз.
Пункты репутации: 9
Не нравится что то мне с длл,так как при её открытии всё содержимое грузится в память.
А если допустим нужна одна картинка то всё остальное так сказать излишне в длл. :roll:
Сделал в файл ини(можно обозвать подругому)
загрузку ресурсов(правда размер зоголовков не считал а тупо на 100 байт сместил от него на начало ресурса) PS:Можно и с базой наверное заморочиться.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
 
;загрузка в файл
DataSection
  IconStart:
 IncludeBinary "C:\new\Kredit.ico"
  IconEnd:
 
  BitmapStart:
 IncludeBinary "C:\new\Kredit1.ico"
  BitmapEnd:
 
  PngStart:
 IncludeBinary "C:\new\Lizing.ico"
  PngEnd:
EndDataSection
 
OpenFile(0,"C:\new\resursy.ini")
 
 
 
Procedure Saveresursy(resurs_start.i,resurs_End.i)
 
  Static nomerresursa.i
  nomerresursa+1
 
 
 Static nahalo_sledushegoresursa.l
 
       ; OpenFile(0,"C:\new\resursy.ini")
       
       
   If nomerresursa=1
        WriteString(0,"["+Str(nomerresursa)+"]"+#CRLF$,#PB_Ascii)
        WriteString(0,"Nahalo="+Str(100)+#CRLF$,#PB_Ascii)
        WriteString(0,"Size="+Str(resurs_End-resurs_start)+#CRLF$,#PB_Ascii)
        ;
        FileSeek(0, 100, #PB_Absolute)
        WriteData(0,resurs_start,resurs_End-resurs_start)
        nahalo_sledushegoresursa=resurs_End-resurs_start+101
       
      Else
        FileSeek(0,nahalo_sledushegoresursa, #PB_Absolute)
       
        WriteString(0,#CRLF$,#PB_Ascii)
        WriteString(0,"["+Str(nomerresursa)+"]"+#CRLF$,#PB_Ascii)
        WriteString(0,"nahalo="+Str(nahalo_sledushegoresursa+100)+#CRLF$,#PB_Ascii)
        WriteString(0,"Size="+Str(resurs_End-resurs_start),#PB_Ascii)
       
        FileSeek(0,nahalo_sledushegoresursa+100, #PB_Absolute)
        WriteData(0,resurs_start,resurs_End-resurs_start)
       
        nahalo_sledushegoresursa=resurs_End-resurs_start+nahalo_sledushegoresursa+101
 
       
      EndIf  
       
        ;CloseFile(0)
       
 
       
EndProcedure    
 
   
      Saveresursy(?IconStart,?IconEnd)
      Saveresursy(?BitmapStart,?BitmapEnd)
      Saveresursy(?PngStart,?PngEnd)  
 
 
  CloseFile(0)
 
 


и
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 
;загрузка из файла
Procedure Openresursy(failresursa$)
;можно сделатьгрупповую загрузку
EndProcedure
Procedure Openresurs(failresursa$,nomerresursa.i)
  Protected *mem
  Protected nahalo_resursa.l
  Protected razmer.l
  OpenPreferences(failresursa$)
   PreferenceGroup(Str(nomerresursa))
   nahalo_resursa=ReadPreferenceLong("Nahalo", 200)
   razmer=ReadPreferenceLong("Size", 200)
  ClosePreferences()
   
  OpenFile(0,failresursa$)
 *mem=AllocateMemory(razmer)
    FileSeek(0,nahalo_resursa,#PB_Absolute)
   ReadData(0,*mem,razmer)
    CatchImage(#PB_Any, *mem,razmer)
   
   FreeMemory(*mem)
  CloseFile(0)
EndProcedure    
     
     
       
      UsePNGImageDecoder()  
       Openresurs("C:\new\resursy.ini",1)
       Openresurs("C:\new\resursy.ini",2)
       Openresurs("C:\new\resursy.ini",3)
 
  ShowLibraryViewer("Image", 0)
  CallDebugger
 



Вложения:
Комментарий к файлу: С картинками
ZIP-папка.zip [167.6 KiB]
Скачиваний: 9
Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как в DLL засунуть картинки PNG
СообщениеДобавлено: Пн апр 29, 2019 6:27 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 809
Благодарил (а): 81 раз.
Поблагодарили: 23 раз.
Пункты репутации: 5
переименовал файл и всё заработало, интересный облом
вчера удалось только попробовать, но картинка так и не вывелась, может сегодня получится поразвлекаться, да ещё Сергей коду подкинул :D
эта строка возвращает некий номер, но картинки нет
Код:
1
2
n=ImageGadget(11, 9, 9, 0, 0, CallFunction(234, "clubs"))
 


Сергейчик писал(а):
Не нравится что то мне с длл,так как при её открытии всё содержимое грузится в память

винда все длл так грузит
но тут же возникает вопрос, если ты картинки распихаешь по разным файлам, то да, а если картинки все в одном файле будут, то будет тоже самое
код забрал, но когда пинать буду незнаю


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как в DLL засунуть картинки PNG
СообщениеДобавлено: Пн апр 29, 2019 7:05 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 465
Благодарил (а): 33 раз.
Поблагодарили: 52 раз.
Пункты репутации: 0
Если загрузить иконки в имагелист, то длл можно выгружать, имагелист имеет свои дескриптора и индексы иконок, и требует выгрузки-освобождение ресурсов


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как в DLL засунуть картинки PNG
СообщениеДобавлено: Пн апр 29, 2019 8:19 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 827
Благодарил (а): 2 раз.
Поблагодарили: 38 раз.
Пункты репутации: 9
newJS писал(а):
винда все длл так грузит
но тут же возникает вопрос, если ты картинки распихаешь по разным файлам, то да, а если картинки все в одном файле будут, то будет тоже самое
код забрал, но когда пинать буду незнаю


Нет не тоже самое,сдесь грузит одну картинку из набора(файла) в память и после перикидывает её из памяти куда надо
а можно сделать процедуру для загрузки сразу всех картинок в память тогда да будет как длл грузить всё содержимое в память но допустим в проге создаётся убивается по несколько картинок,тогда каждый раз длл всё содержимое с 500картинками будет в память грузить. :roll: а тут только именно нужные картинки.
PS:Если группу картинок грузить по одной как сейчас то по времени подольше но после каждой загрузки память освобождется и следовательно нет одномоментного роста на всю группу картинок. :wink:
Переделал загрузчик и отступ до данных картинки пересчитал(вроде правильно?)
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 
 
Procedure Saveresursy(resurs_start.i,resurs_End.i)
 
  Static nomerresursa.i
  nomerresursa+1
 
 
 Static nahalo_sledushegoresursa.l
 
     
       
       
 If nomerresursa=1
   
        WriteString(0,"["+Str(nomerresursa)+"]"+#CRLF$+"Nahalo="+Str(32)+#CRLF$+"Size="+Str(resurs_End-resurs_start)+#CRLF$,#PB_Ascii)
        ;
        FileSeek(0, 32, #PB_Absolute)
        WriteData(0,resurs_start,resurs_End-resurs_start)
        nahalo_sledushegoresursa=resurs_End-resurs_start+33
       
      Else
        FileSeek(0,nahalo_sledushegoresursa, #PB_Absolute)
       
       WriteString(0,#CRLF$+"["+Str(nomerresursa)+"]"+#CRLF$+"nahalo="+Str(nahalo_sledushegoresursa+35)+#CRLF$+"Size="+Str(resurs_End-resurs_start)+#CRLF$,#PB_Ascii)
       
        FileSeek(0,nahalo_sledushegoresursa+35, #PB_Absolute)
        WriteData(0,resurs_start,resurs_End-resurs_start)
       
        nahalo_sledushegoresursa=resurs_End-resurs_start+nahalo_sledushegoresursa+36
 
      EndIf  
             
EndProcedure    
 
 


В общем это как импровизированная база,только загрузку надо в неё делать без инклудников и редактирование сделать. :roll:


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как в DLL засунуть картинки PNG
СообщениеДобавлено: Пн апр 29, 2019 11:15 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11461
Благодарил (а): 4 раз.
Поблагодарили: 464 раз.
newJS писал(а):
эта строка возвращает некий номер, но картинки нет
Это все равно что написать.
Код:
1
2
3
4
Procedure clubs()
EndProcedure
 
n=ImageGadget(11, 9, 9, 0, 0, @clubs())

В теме есть несколько примеров. Почему бы не посмотреть как они устроены?

Сергейчик писал(а):
Не нравится что то мне с длл,так как при её открытии всё содержимое грузится в память.
Для этого картинки должны быть в ресурсах, которые не загружаются вместе с исполняемым файлом.

Сергейчик писал(а):
загрузку ресурсов(правда размер зоголовков не считал а тупо на 100 байт сместил от него на начало ресурса)
В примере нет работы с ресурсами. Посмотри этот код viewtopic.php?p=92035#p92035

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как в DLL засунуть картинки PNG
СообщениеДобавлено: Пн апр 29, 2019 11:27 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6515
Благодарил (а): 28 раз.
Поблагодарили: 213 раз.
Пункты репутации: 57
какие то мутные у вас тут схемы :D
RES файл думаю все могут создавать, специальных программ море. Я делаю редактором ресурсов
из VB6, он кидает PNG файлы в секцию CUSTOM
Создание DLL со своими ресурсами из файла RES нужна всего 1 строчка.
Код:
1
Import "Project1.RES" : EndImport



Project1.RES - это мой файл ресурсов, там 3 PNG, больше нет ни чего.
В коде DLL тоже больше нет ничего, всё остальное делает Компилятор Пурика через настройки.

Как использовать:

В коде всего 6 очень простых строчек, которые можно написать на ЛЮБОМ ЯП, юзающим WINAPI.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
UsePNGImageDecoder()
; грузим нашу DLL или exe с ресурсами
hExe = LoadLibrary_("png.dll"); 1
; Имя ресурса можно из ResHacker
res.s = "#101"
hRes = FindResource_(hExe, @res, "CUSTOM") ; 2
 ;  Грузим в память ресурс
hResLoad = LoadResource_(hExe, hRes); 3
lpResLock = LockResource_(hResLoad) ;4
Size = SizeofResource_(hExe, hRes)  ;5
; Можно извлечь изображение (нужен UsePNGImageDecoder) и делать с ним что угодно:
   CatchImage(0, hResLoad, Size) ; 6
; Например сохранить
SaveImage(0,"C:\imgres.bmp")
; Очистка.
FreeLibrary_(hExe)    ;7



Полный пакет файлов для проекта:


Вложения:
DLL_png.7z [147.04 KiB]
Скачиваний: 9

_________________
read-only ¯\_(ツ)_/¯
Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как в DLL засунуть картинки PNG
СообщениеДобавлено: Пн апр 29, 2019 12:07 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11461
Благодарил (а): 4 раз.
Поблагодарили: 464 раз.
kvitaliy писал(а):
RES файл думаю все могут создавать
Его PB может создать из rc файла.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 61 ]  На страницу 1, 2, 3, 4, 5  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB