PureBasic - форум

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

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


Вы здесь » PureBasic - форум » PureBasic для Windows » Импорт DLL


Импорт DLL

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

1

Код:
#QFR_0           = 0 ; Unknown
#QFR_DESCRIPTION = 1 ; Имя шрифта, которое используется системой
#QFR_LOGFONT     = 2 ; Массив структур LOGFONT
#QFR_PDEV        = 3 ; Unknown
#QFR_FONTFILE    = 4 ; Имя файла шрифта
#QFR_5           = 5 ; Unknown
#FR_NOT_ENUM = $20
Import "gdi32.lib"
;    BOOL GetFontResourceInfo(
;    LPCTSTR lpszFilename,    // font file name
;    LPDWORD cbBuffer,        // size of buffer For resouce information
;    LPVOID lpBuffer,         // buffer For returned resouce information
;    DWORD dwQueryType,       / resouce information query type
;    );
  GetFontResourceInfo(*ttf_file,cbBuffer,*buff,flg) As "_GetFontResourceInfoW@16"
  AddFontResourceEx(*name,fl,res) As "_AddFontResourceExW@12";https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-addfontresourceexa
  RemoveFontResourceEx(*name,fl,res) As "_RemoveFontResourceExW@12";https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-removefontresourceexw
EndImport
;https://www.manhunter.ru/assembler/1953_poluchenie_informacii_o_shrifte_s_pomoschyu_funkcii_getfontresourceinfo.html
cb=#MAX_PATH
*buff=AllocateMemory(cb)
ttf$="d:\0\font.ttf"; path to .TTF
rr=AddFontResourceEx(@ttf$,#FR_NOT_ENUM,0)
rr=GetFontResourceInfo(@ttf$,@cb,*buff,#QFR_DESCRIPTION)
;ShowMemoryViewer(*buff,cb)
Debug PeekS(*buff,-1,#PB_Unicode)
RemoveFontResourceEx(@ttf$,#FR_NOT_ENUM,0)
FreeMemory(*buff)

Надоело возиться с LoadLibrary(), GetFunction().
gdi32.lib взял из пакета MASM32. Есть ли способ создания .lib для других DLL?

0

2

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

gdi32.lib взял из пакета MASM32.

Чем не подошла библиотека из "PureLibraries\Windows\Libraries\"?

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

Есть ли способ создания .lib для других DLL?

Готовых нет в папке PB, в SDK и др. источниках?
Можно сделать используя polib.exe из дистрибутива PB.

Код:
polib.exe /out:lib.lib dll.dll

0

3

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

Чем не подошла библиотека из "PureLibraries\Windows\Libraries\"?

https://upforme.ru/uploads/0009/ae/28/618/t477189.png

0

4

Если компилируете в x64, декларация должна быть другой.

Код:
Import "gdi32.lib"
;    BOOL GetFontResourceInfo(
;    LPCTSTR lpszFilename,    // font file name
;    LPDWORD cbBuffer,        // size of buffer For resouce information
;    LPVOID lpBuffer,         // buffer For returned resouce information
;    DWORD dwQueryType,       / resouce information query type
;    );
  GetFontResourceInfo(*ttf_file,cbBuffer,*buff,flg) As "GetFontResourceInfoW"
  AddFontResourceEx(*name,fl,res) As "AddFontResourceExW";https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-addfontresourceexa
  RemoveFontResourceEx(*name,fl,res) As "RemoveFontResourceExW";https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-removefontresourceexw
EndImport

0

5

Нет, только p86 версии 5.30. И не находятся функции с префиксом W

0

6

Может стоит обновить pb? Или взять библиотеки из новой версии где есть эти функции с префиксом W.

0

7

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

Может стоит обновить pb? Или взять библиотеки из новой версии где есть эти функции с префиксом W.

Ну вот и ответ на заданный Вами вопрос(:

10-ка, х64. на 5.72 программа валится на GetFontResourceInfoW.

с OpenLibrary/GetFunction/CallFunctionFast работает.

Так пользоваться ли такой библиотекой импорта. или нет - неясно.

0

8

Код:
#QFR_0           = 0 ; Unknown
#QFR_DESCRIPTION = 1 ; Имя шрифта, которое используется системой
#QFR_LOGFONT     = 2 ; Массив структур LOGFONT
#QFR_PDEV        = 3 ; Unknown
#QFR_FONTFILE    = 4 ; Имя файла шрифта
#QFR_5           = 5 ; Unknown
#FR_NOT_ENUM = $20

;    BOOL GetFontResourceInfo(
;    LPCTSTR lpszFilename,    // font file name
;    LPDWORD cbBuffer,        // size of buffer For resouce information
;    LPVOID lpBuffer,         // buffer For returned resouce information
;    DWORD dwQueryType,       / resouce information query type
;    );
;https://www.manhunter.ru/assembler/1953_poluchenie_informacii_o_shrifte_s_pomoschyu_funkcii_getfontresourceinfo.html
If OpenLibrary(0,"GDI32.dll")
cb=#MAX_PATH
*buff=AllocateMemory(cb)
Dim bu.b(cb)
ttf$="c:\Windows\Fonts\BOD_CI.TTF"; path to .TTF
*f=GetFunction(0,"AddFontResourceExW")
CallFunctionFast(*f,@ttf$,#FR_NOT_ENUM,0)
*f=GetFunction(0,"GetFontResourceInfoW")
CallFunctionFast(*f,@ttf$,@cb,*buff,#QFR_DESCRIPTION)
;ShowMemoryViewer(*buff,cb)
Debug PeekS(*buff,-1,#PB_Unicode);Bodoni MT Condensed Курсив
*f=GetFunction(0,"RemoveFontResourceExW")
CallFunctionFast(*f,@ttf$,#FR_NOT_ENUM,0)
FreeMemory(*buff)
CloseLibrary(0)
Else
  Debug "no dll"
EndIf

Не стал добавлять проверку ошибок, работает так. Может, попробовать protype?

0

9

PB 6.02 x64, ничего не вылетело и отобразилось правильное имя шрифта

Код:
#QFR_0           = 0 ; Unknown
#QFR_DESCRIPTION = 1 ; Имя шрифта, которое используется системой
#QFR_LOGFONT     = 2 ; Массив структур LOGFONT
#QFR_PDEV        = 3 ; Unknown
#QFR_FONTFILE    = 4 ; Имя файла шрифта
#QFR_5           = 5 ; Unknown
#FR_NOT_ENUM = $20
Import "gdi32.lib"
;    BOOL GetFontResourceInfo(
;    LPCTSTR lpszFilename,    // font file name
;    LPDWORD cbBuffer,        // size of buffer For resouce information
;    LPVOID lpBuffer,         // buffer For returned resouce information
;    DWORD dwQueryType,       / resouce information query type
;    );
  GetFontResourceInfo(*ttf_file,cbBuffer,*buff,flg) As "GetFontResourceInfoW"
  AddFontResourceEx(*name,fl,res) As "AddFontResourceExW";https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-addfontresourceexa
  RemoveFontResourceEx(*name,fl,res) As "RemoveFontResourceExW";https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-removefontresourceexw
EndImport
;https://www.manhunter.ru/assembler/1953_poluchenie_informacii_o_shrifte_s_pomoschyu_funkcii_getfontresourceinfo.html
cb=#MAX_PATH
*buff=AllocateMemory(cb)
ttf$="d:\0\font.ttf"; path to .TTF
rr=AddFontResourceEx(ttf$,#FR_NOT_ENUM,0)
rr=GetFontResourceInfo(ttf$,@cb,*buff,#QFR_DESCRIPTION)
;ShowMemoryViewer(*buff,cb)
Debug PeekS(*buff,-1,#PB_Unicode)
RemoveFontResourceEx(ttf$,#FR_NOT_ENUM,0)
FreeMemory(*buff)

В PB 5.50 была добавлена функция RegisterFontFile(), позволяющая загрузить шрифт из файла.
https://www.purebasic.com/documentation … tfile.html

Может подойдет функция AddFontMemResourceEx https://learn.microsoft.com/ru-ru/windo … resourceex
Шрифт можно загружать из памяти в том числе с DataSection.

0

10

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

Может подойдет функция AddFontMemResourceEx https://learn.microsoft.com/ru-ru/windo … resourceex
Шрифт можно загружать из памяти в том числе с DataSection.

Это не проблема, я уже использовал установку. Здесь трюк - определение имени шрифта.

0

11

Тогда берете библиотеку gdi32.lib из PB 6.xx и помещаете ее в папку с исходником.
В PB 5.24 код нормально работает, а значит в PB 5.30 тоже должен.

0

12

5.30 x86 - сработало двумя способами - и с библиотекой MASM32, и gdi32.lib, полученной polib.exe
6.20 x64 - сработал пример, который написал Пётр.

0

13

Только неясно, что за тип компилятора такой - C Backend

0

14

https://www.purebasic.fr/blog/?p=480
https://www.purebasic.fr/blog/?p=486

0

15

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

Только неясно, что за тип компилятора такой - C Backend

Из справки:

22 Июнь 2022 : Версия 6.00 LTS

Мы уже 3 года имеем "C Backend". Сам не появляется в списке, надо добавить компилятор в настройках, выбрав компилятор через диалог открытия файлов.

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Импорт DLL