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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д