GDI+可以动态加载吗?
我用的是这个 http://www.mitov.com/html/igdi_.html
我想实现这样的效果:如果系统中有GDI+库,则使用GDI+;没有GDI+库,则不使用GDI+,并且不会引起异常。
可以把它转化成这个形式吗:
unit RT_tags;interfaceuses Windows;varTAGS_Read: function (handle: DWORD; const fmt: PAnsiChar): PAnsiChar; stdcall;TAGS_GetLastErrorDesc: function : PAnsiChar; stdcall;TAGS_GetVersion: function : DWORD; stdcall;var BassTag_Handle : Thandle = 0;function Load_BassTagDLL(const dllfilename : string) : boolean;procedure Unload_BassTagDLL;implementationfunction Load_BassTagDLL(const dllfilename : string) : boolean;var oldmode : integer;begin if BassTag_Handle <> 0 then // is it already there ? result := true else begin {go & load the dll} oldmode := SetErrorMode($8001); BassTag_Handle := LoadLibrary(pchar(dllfilename)); // obtain the handle we want SetErrorMode(oldmode); if BassTag_Handle <> 0 then begin {now we tie the functions to the VARs from above} @TAGS_Read := GetProcAddress(BassTag_Handle, 'TAGS_Read'); @TAGS_GetLastErrorDesc := GetProcAddress(BassTag_Handle, 'TAGS_GetLastErrorDesc'); @TAGS_GetVersion := GetProcAddress(BassTag_Handle, 'TAGS_GetVersion'); // check if everything is linked in correctly if (@TAGS_Read = nil){ or (@TAGS_GetLastErrorDesc = nil) or (@TAGS_GetVersion = nil)} then begin FreeLibrary(BassTag_Handle); BassTag_Handle := 0; end; end; result := (BassTag_Handle <> 0); end;end;procedure Unload_BassTagDLL;begin if BassTag_Handle <> 0 then FreeLibrary(BassTag_Handle); BassTag_Handle := 0;end;end.
GdipGetLineRectI := LoadGdiPlusMethod('GdipGetLineRectI');
GdipSetLineColors := LoadGdiPlusMethod('GdipSetLineColors');
GdipGetLineColors := LoadGdiPlusMethod('GdipGetLineColors');
GdipSetLineWrapMode := LoadGdiPlusMethod('GdipSetLineWrapMode');
GdipGetLineWrapMode := LoadGdiPlusMethod('GdipGetLineWrapMode');
// GDI+ Hatch Brush methods loading
GdipCreateHatchBrush := LoadGdiPlusMethod('GdipCreateHatchBrush');
GdipGetHatchStyle := LoadGdiPlusMethod('GdipGetHatchStyle');
GdipGetHatchForegroundColor := LoadGdiPlusMethod('GdipGetHatchForegroundColor');
GdipGetHatchBackgroundColor := LoadGdiPlusMethod('GdipGetHatchBackgroundColor');
// GDI+ Pen methods loading
GdipCreatePen1 := LoadGdiPlusMethod('GdipCreatePen1');
GdipCreatePen2 := LoadGdiPlusMethod('GdipCreatePen2');
GdipClonePen := LoadGdiPlusMethod('GdipClonePen');
GdipDeletePen := LoadGdiPlusMethod('GdipDeletePen');
GdipGetPenFillType := LoadGdiPlusMethod('GdipGetPenFillType');
GdipSetPenBrushFill := LoadGdiPlusMethod('GdipSetPenBrushFill');
GdipGetPenBrushFill := LoadGdiPlusMethod('GdipGetPenBrushFill');
GdipSetPenColor := LoadGdiPlusMethod('GdipSetPenColor');
GdipGetPenColor := LoadGdiPlusMethod('GdipGetPenColor');
GdipSetPenMode := LoadGdiPlusMethod('GdipSetPenMode');
GdipGetPenMode := LoadGdiPlusMethod('GdipGetPenMode');
GdipSetPenWidth := LoadGdiPlusMethod('GdipSetPenWidth');
GdipGetPenWidth := LoadGdiPlusMethod('GdipGetPenWidth');
GdipGetPenDashStyle := LoadGdiPlusMethod('GdipGetPenDashStyle');
GdipSetPenDashStyle := LoadGdiPlusMethod('GdipSetPenDashStyle');
// GDI+ Graphis methods loading
GdipCreateFromHDC := LoadGdiPlusMethod('GdipCreateFromHDC');
GdipDeleteGraphics := LoadGdiPlusMethod('GdipDeleteGraphics');
GdipGetDC := LoadGdiPlusMethod('GdipGetDC');
GdipReleaseDC := LoadGdiPlusMethod('GdipReleaseDC');
GdipGraphicsClear := LoadGdiPlusMethod('GdipGraphicsClear');
GdipDrawLineI := LoadGdiPlusMethod('GdipDrawLineI');
GdipDrawLinesI := LoadGdiPlusMethod('GdipDrawLinesI');
GdipFillRectangleI := LoadGdiPlusMethod('GdipFillRectangleI');
GdipDrawArcI := LoadGdiPlusMethod('GdipDrawArcI');
GdipDrawBezierI := LoadGdiPlusMethod('GdipDrawBezierI');
GdipDrawRectangleI := LoadGdiPlusMethod('GdipDrawRectangleI');
GdipDrawEllipseI := LoadGdiPlusMethod('GdipDrawEllipseI');
GdipDrawPieI := LoadGdiPlusMethod('GdipDrawPieI');
GdipDrawPolygonI := LoadGdiPlusMethod('GdipDrawPolygonI');
GdipDrawCurve2I := LoadGdiPlusMethod('GdipDrawCurve2I');
GdipDrawClosedCurve2I := LoadGdiPlusMethod('GdipDrawClosedCurve2I');
GdipFillPolygonI := LoadGdiPlusMethod('GdipFillPolygonI');
GdipFillEllipseI := LoadGdiPlusMethod('GdipFillEllipseI');
GdipFillPieI := LoadGdiPlusMethod('GdipFillPieI');
GdipFillClosedCurveI := LoadGdiPlusMethod('GdipFillClosedCurveI');
// added from MSN
GdipLoadImageFromStream := LoadGdiPlusMethod('GdipLoadImageFromStream');
GdipCreateBitmapFromFile := LoadGdiPlusMethod('GdipCreateBitmapFromFile');
GdipCreateBitmapFromStream := LoadGdiPlusMethod('GdipCreateBitmapFromStream');
GdipCreateBitmapFromStreamICM := LoadGdiPlusMethod('GdipCreateBitmapFromStreamICM');
GdipCreateHBITMAPFromBitmap := LoadGdiPlusMethod('GdipCreateHBITMAPFromBitmap');
GdipLoadImageFromFile := LoadGdiPlusMethod('GdipLoadImageFromFile');
GdipGetImageDimension := LoadGdiPlusMethod('GdipGetImageDimension');
GdipDrawImageRectI := LoadGdiPlusMethod('GdipDrawImageRectI');
GdipDisposeImage := LoadGdiPlusMethod('GdipDisposeImage');
GdipGetImageEncodersSize := LoadGdiPlusMethod('GdipGetImageEncodersSize');
GdipGetImageEncoders := LoadGdiPlusMethod('GdipGetImageEncoders');
GdipSaveImageToStream := LoadGdiPlusMethod('GdipSaveImageToStream');
GdipCreateBitmapFromHBITMAP := LoadGdiPlusMethod('GdipCreateBitmapFromHBITMAP');
GdipIsVisibleRect := LoadGdiPlusMethod('GdipIsVisibleRect');
GdipIsVisibleRectI := LoadGdiPlusMethod('GdipIsVisibleRectI');
GdipGetEncoderParameterListSize := LoadGdiPlusMethod('GdipGetEncoderParameterListSize');
GdipGetEncoderParameterList := LoadGdiPlusMethod('GdipGetEncoderParameterList');
GdipCreateBitmapFromGdiDib := LoadGdiPlusMethod('GdipCreateBitmapFromGdiDib');
GdipCreateBitmapFromScan0 := LoadGdiPlusMethod('GdipCreateBitmapFromScan0');
GdipBitmapLockBits := LoadGdiPlusMethod('GdipBitmapLockBits');
GdipBitmapUnlockBits := LoadGdiPlusMethod('GdipBitmapUnlockBits');
GdipDrawImageRectRectI := LoadGdiPlusMethod('GdipDrawImageRectRectI');
GdipDrawImageRectRect := LoadGdiPlusMethod('GdipDrawImageRectRect');
GdipDrawImagePointRect := LoadGdiPlusMethod('GdipDrawImagePointRect');
GdipCloneImage := LoadGdiPlusMethod('GdipCloneImage');
GdipCreateTexture2I := LoadGdiPlusMethod('GdipCreateTexture2I');
GdipCreateImageAttributes := LoadGdiPlusMethod('GdipCreateImageAttributes');
GdipDisposeImageAttributes := LoadGdiPlusMethod('GdipDisposeImageAttributes');
GdipSetImageAttributesColorMatrix := LoadGdiPlusMethod('GdipSetImageAttributesColorMatrix');
GdipAddPathArc := LoadGdiPlusMethod('GdipAddPathArc');
GdipAddPathLine := LoadGdiPlusMethod('GdipAddPathLine');
GdipClosePathFigure := LoadGdiPlusMethod('GdipClosePathFigure');
GdipCreatePath := LoadGdiPlusMethod('GdipCreatePath');
GdipDeletePath := LoadGdiPlusMethod('GdipDeletePath');
GdipDrawPath := LoadGdiPlusMethod('GdipDrawPath');
GdipFillPath := LoadGdiPlusMethod('GdipFillPath');
GdipStartPathFigure := LoadGdiPlusMethod('GdipStartPathFigure');
//lcm
GdipSetInterpolationMode := LoadGdiPlusMethod('GdipSetInterpolationMode');
GdipGetInterpolationMode := LoadGdiPlusMethod('GdipGetInterpolationMode');
GdipCreateCachedBitmap := LoadGdiPlusMethod('GdipCreateCachedBitmap');
GdipDeleteCachedBitmap := LoadGdiPlusMethod('GdipDeleteCachedBitmap');
GdipDrawCachedBitmap := LoadGdiPlusMethod('GdipDrawCachedBitmap');
GdipCreateBitmapFromGraphics := LoadGdiPlusMethod('GdipCreateBitmapFromGraphics');
GdipGetImageGraphicsContext := LoadGdiPlusMethod('GdipGetImageGraphicsContext');
GdipGetImageWidth := LoadGdiPlusMethod('GdipGetImageWidth');
GdipGetImageHeight := LoadGdiPlusMethod('GdipGetImageHeight');
GdipSetCompositingMode := LoadGdiPlusMethod('GdipSetCompositingMode');
GdipGetCompositingMode := LoadGdiPlusMethod('GdipGetCompositingMode');
GdipSetCompositingQuality := LoadGdiPlusMethod('GdipSetCompositingQuality');
GdipGetCompositingQuality := LoadGdiPlusMethod('GdipGetCompositingQuality');
GdipSetSmoothingMode := LoadGdiPlusMethod('GdipSetSmoothingMode');
GdipGetSmoothingMode := LoadGdiPlusMethod('GdipGetSmoothingMode');
GdipCloneBitmapAreaI := LoadGdiPlusMethod('GdipCloneBitmapAreaI');
//
if (GdiPlusStartup(FGDIPlusToken, DefaultStartup, @FGdiPlusHook) <> OK) or
(FGdiPlusHook.NotificationHook(FGDIPlusToken) <> Ok) then
begin
FGDIPresent := False;
FillChar(FGdiPlusHook, SizeOf(FGdiPlusHook), 0);
end;
end;
end;
[解决办法]
没有注意到,不是操作系统自带的吗?
好像xp自带就有。
别的系统,底层类库可能不支持了。