COM GDI+ - VB

Узнай цену своей работы

Формулировка задачи:

Добрый день. Было запланировано создание type library под интерфейсы gdi+, которые описаны в msdn. При поиске идентификаторов CLSID интерфейсов в реестре оказалось, что их попросту нет, точно также как и ссылки на расположение gdiplus.dll. Возникло впечатление, что библиотека попросту не зарегистрирована. Поиск по системному каталогу показал, что разные версии gdiplus.dll раскиданы в папках программ в Program Files, но никак не в root\Windows\System32. В общем и целом это не принципиально, была выбрана одна версия dll, размещена в папке system32, для неё использован regsvr32.exe, но было получено сообщение об ошибке: «DllRegServer не найден.». Действительно, в библиотеке полно функций, свыше 600, и нет стандартных для регистрации dll. Это дает возможность предположить, что gdiplus.dll – процедурная, нативная библиотека. Но как с ней работать, если в msdn 1998 года описана COM библиотека с кучей классов. Где её взять или где взять документацию под процедурную dll? Спасибо.

Решение задачи: «COM GDI+»

textual
Листинг программы
Option Explicit
 
Private Type GdiplusStartupInput
GdiplusVersion As Long
DebugEventCallback As Long
SuppressBackgroundThread As Long
SuppressExternalCodecs As Long
End Type
 
Private Type GdiplusStartupOutput
NotificationHook As Long
NotificationUnhook As Long
End Type
 
Private Type GUID
data1 As Long
data2 As Integer
data3 As Integer
data4(0 To 7) As Byte
End Type
 
Private Type EncoderParameter
GUID As GUID
NumberOfValues As Long
Type As Long
Value As Long
End Type
 
Private Type EncoderParameters
count As Long
Parameter As EncoderParameter
End Type
 
Private Const OBJ_BITMAP = 7
Private Const EncoderParameterValueTypeLong = 4
 
Private Declare Function GdipLoadImageFromFile Lib "gdiplus" (ByVal FileName As Long, hImage As Long) As Long
Private Declare Function GdiplusStartup Lib "gdiplus" (token As Long, inputbuf As GdiplusStartupInput, outputbuf As GdiplusStartupOutput) As Long
Private Declare Function GdiplusShutdown Lib "gdiplus" (ByVal token As Long) As Long
Private Declare Function GdipCreateBitmapFromHBITMAP Lib "gdiplus" (ByVal hbm As Long, ByVal hpal As Long, bitmap As Long) As Long
Private Declare Function GdipDisposeImage Lib "gdiplus" (ByVal image As Long) As Long
Private Declare Function GdipSaveImageToFile Lib "gdiplus" (ByVal image As Long, ByVal FileName As Long, clsidEncoder As GUID, encoderParams As Any) As Long
Private Declare Function CLSIDFromString Lib "ole32" (ByVal str As Long, id As GUID) As Long
Private Declare Function GetCurrentObject Lib "gdi32" (ByVal hdc As Long, ByVal uObjectType As Long) As Long
 
Private Sub Command1_Click()
 
Dim gdiSI As GdiplusStartupInput
Dim gdiSO As GdiplusStartupOutput
Dim lGDIP As Long
Dim lBitmap As Long
Dim hBitmap As Long
Dim TParams As EncoderParameters
Dim encoderCLSID As GUID
Dim tDC As Long
Dim m_hDC As Long
 
gdiSI.GdiplusVersion = 1
 
Call GdiplusStartup(lGDIP, gdiSI, gdiSO)
 
hBitmap = GetCurrentObject(Picture1.hdc, OBJ_BITMAP)
 
Call GdipCreateBitmapFromHBITMAP(hBitmap, 0, lBitmap)
 
Call CLSIDFromString(StrPtr("{557CF401-1A04-11D3-9A73-0000F81EF32E}"), encoderCLSID)
 
TParams.count = 1
 
With TParams.Parameter
Call CLSIDFromString(StrPtr("{1D5BE4B5-FA4A-452D-9CDD-5DB35105E7EB}"), .GUID)
.NumberOfValues = 1
.Type = EncoderParameterValueTypeLong
.Value = VarPtr(10)
End With
 
Call GdipSaveImageToFile(lBitmap, StrPtr("c:\lBmp.jpg"), encoderCLSID, TParams)
 
Call GdipDisposeImage(lBitmap)
Call GdiplusShutdown(lGDIP)
 
End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.333 из 5