Zawartość pliku konwertujASM:
.586p
.mmx
.model flat, stdcall
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
include \masm32\include\masm32.inc
include \masm32\include\gdiplus.inc
include \masm32\macros\macros.asm
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\gdiplus.lib
; struktury potrzebne do obslugi GDI+
GDIstart STRUCT
GdiplusVersion DWORD ?
DebugEventCallback DWORD ?
SuppressBackgroundThread DWORD ?
SuppressExternalCodecs DWORD ?
GDIstart ENDS
PNGinfo STRUCT
ClassID CLSID <>
FormatID GUID <>
CodecName DWORD ?
DllName DWORD ?
FormatDescription DWORD ?
FilenameExtension DWORD ?
MimeType DWORD ?
Flags DWORD ?
Version DWORD ?
SigCount DWORD ?
SigSize DWORD ?
SigPattern DWORD ?
SigMask DWORD ?
PNGinfo ENDS
konwertujASM PROTO :DWORD,:DWORD
.code
konwertujASM proc uses esi edi ebx zrodlo:dword,cel:dword
LOCAL uni_zrodlo[1024] :BYTE
LOCAL uni_cel[1024] :BYTE
LOCAL uni_mime[64] :BYTE
LOCAL zet :DWORD
LOCAL obraz :DWORD
LOCAL enkoder :DWORD
LOCAL rozmiarPNGinfo :DWORD
LOCAL wskPNGinfo :DWORD
LOCAL gdipsi :GDIstart
;inicjalizacja
fn RtlZeroMemory,addr gdipsi,sizeof GDIstart
mov gdipsi.GdiplusVersion,1
mov zet,0
mov obraz,0
mov enkoder,0
mov rozmiarPNGinfo,0
mov wskPNGinfo,0
; konwersja do Unicode (ze wzgledu na GDI+)
fn MultiByteToWideChar,0,MB_PRECOMPOSED,zrodlo,-1,addr uni_zrodlo,sizeof uni_zrodlo
fn MultiByteToWideChar,0,MB_PRECOMPOSED,cel,-1,addr uni_cel,sizeof uni_cel
mov edx,chr$("obraz/png")
fn MultiByteToWideChar,0,MB_PRECOMPOSED,edx,-1,addr uni_mime,sizeof uni_mime
; obsluga GDI+
fn GdiplusStartup,addr zet,addr gdipsi, NULL
fn GdipLoadImageFromFile,addr uni_zrodlo,addr obraz
fn GdipGetImageEncodersSize,addr enkoder,ADDR rozmiarPNGinfo
mov wskPNGinfo,alloc(rozmiarPNGinfo)
fn GdipGetImageEncoders,enkoder,rozmiarPNGinfo,wskPNGinfo
xor ebx,ebx
mov esi,wskPNGinfo
skok: cmp ebx, enkoder
jae dalej2
fn ucCmp,[esi].PNGinfo.MimeType,addr uni_mime
cmp eax, 0
je dalej1
fn GdipSaveImageToFile,obraz,addr uni_cel,esi,NULL
dalej1: add esi, SIZEOF PNGinfo
inc ebx
jmp skok
dalej2: fn GdipDisposeImage, obraz
fn GdiplusShutdown, zet
free wskPNGinfo
ret
konwertujASM endp
end konwertujASM
plik .def:
LIBRARY "konwertujASM"
EXPORTS
konwertujASM
Paczka z projektem w radasm:
http://hotfile.com/dl/102474561/9fedde2/konwertujASM.zip.html
Próbowałem wywołać ją poprzez
public static extern void konwertujASM([MarshalAs(UnmanagedType.AnsiBStr)]String plik, [MarshalAs(UnmanagedType.AnsiBStr)]String docelowy);
, bez rezultatu.