I am playing with a prog which displays "mini images" - made from a file.jpg
When you click on the mini the originalsized jpg opens.
I made it out of various examples for bitblt and stretchblt.
Works fine.
Only problem is that I absolutely don't understand what the proc "UnicodeStr" is doing and
I hate not understanding part of my program.
Could someone give me information on this proc,please ?
.IF uMsg==WM_CREATE
mov eax,OFFSET StartupInfo
mov GdiplusStartupInput.GdiplusVersion[eax],1
INVOKE GdiplusStartup,ADDR token,ADDR StartupInfo,0
INVOKE UnicodeStr,ADDR image_name,ADDR UnicodeFileName ;ascii to unicode I suppose
INVOKE GdipCreateBitmapFromFile,ADDR UnicodeFileName,ADDR BmpImage
INVOKE GdipCreateHBITMAPFromBitmap,BmpImage,ADDR hBitmap,0
;BITMAP.bmWidth[edx] height and width of the selected picture
;BITMAP.bmHeight[edx]
.ELSEIF uMsg==WM_PAINT
INVOKE BeginPaint,hWnd,ADDR ps
mov hdc,eax
INVOKE CreateCompatibleDC,hdc
mov hMemDC,eax
INVOKE SelectObject,eax,hBitmap
INVOKE GetObject,hBitmap,sizeof(BITMAP),ADDR bm
lea edx,bm
mov eax,iCurrentMode
INVOKE SetStretchBltMode,hdc,eax
INVOKE StretchBlt,hdc,460,235,150,113,hMemDC,0,0,BITMAP.bmWidth[edx],BITMAP.bmHeight[edx],SRCCOPY
;150 x 113 is provisorial - works only with pictures in 4 x 3 relation 800x600 1024x68 3648x236
INVOKE DeleteDC,hMemDC
INVOKE EndPaint,hWnd,ADDR ps
;====================
;Changes the ascii image stringto a unicode string I suppose
UnicodeStr PROC USES esi ebx Source:DWORD,Dest:DWORD
mov ebx,1
mov esi,Source
mov edx,Dest
xor eax,eax
sub eax,ebx ; ?? eax is -1 in any case this moment
@@:
add eax,ebx ; I don't see that ebx has changed
movzx ecx,BYTE PTR [esi+eax] ;??
mov WORD PTR [edx+eax*2],cx ;??
test ecx,ecx
jnz @b
ret
UnicodeStr ENDP
;====================
I have never heard of the UnicodeStr function ?
But you can replace it with "MultiByteToWideChar", below is a link to msdn
.data?
UnicodeFileName dw MAX_PATH dup (?)
.data
imagestring db "beautiful.jpg",0
.code
; skip this line:
INVOKE UnicodeStr,ADDR image_name,ADDR UnicodeFileName ;ascii to unicode I suppose
; replace it by this line:
invoke MultiByteToWideChar,CP_ACP,0,ADDR imagestring,-1,ADDR UnicodeFileName,MAX_PATH-1
invoke GdipCreateBitmapFromFile,ADDR UnicodeFileName,ADDR BmpImage
https://msdn.microsoft.com/en-us/library/windows/desktop/dd319072(v=vs.85).aspx
As a macro:include \masm32\include\masm32rt.inc
.data
txImageAnsi db "SomeImage.jpg", 0
txTitle dw "H", "E", "L", "L", "O", 0 ; the clumsy way of defining a Unicode string
.data?
txImageUnicode dw sizeof txImageAnsi dup(?)
UnicodeString MACRO ansiArg, ucArg
pushad
mov esi, ansiArg
mov edi, ucArg
xor eax, eax
.Repeat
lodsb
stosw
.Until !eax
popad
EXITM <ucArg>
ENDM
.code
start:
invoke MessageBoxW, 0, UnicodeString(offset txImageAnsi, offset txImageUnicode), offset txTitle, MB_OK
exit
end start
Insert an int 3 after mov edi, ucArg to see in Olly how it works. I have written that macro from scratch, but this is basically how wChr$() (http://www.webalice.it/jj2006/MasmBasicQuickReference.htm#Mb1251) works. No rocket science, just a simple lodsb+stosw algo.
Ahhh, it's from masm32rt.inc :biggrin:
I should have a look into that file...
Sure? I can't find UnicodeStr in masm32rt.inc or m32lib ::)
Me neither, I just looked at his code. ( I have to go to sleep, I can't read posts that well anymore :icon_redface: )
There is a suite of pretty useless functions, e.g. RtlAnsiStringToUnicodeString (https://msdn.microsoft.com/en-us/library/ms648413(v=vs.85).aspx)
Quote from: jj2007 on May 18, 2017, 09:13:45 AM
There is a suite of pretty useless functions, e.g. RtlAnsiStringToUnicodeString (https://msdn.microsoft.com/en-us/library/ms648413(v=vs.85).aspx)
This is for another thing called "Unicode_String" which is not the same as Unicode UTF16 Strings which are encoded by double bytes (WCHAR). :icon_rolleyes:
The problem with the UnicodeStr from clamicum as well with the UnicodeString macro is that they only work reliably for converting 7-bit ASCII characters. :icon_rolleyes:
btw.
UnicodeStr isn't a Windows function
It is declared together with the others you need (WinMain and more)
UnicodeStr PROTO :DWORD,:DWORD
Downloaded from this forum "GdipCreateBitmapFromFile.zip"
Thanks, I check out the possibilities
My mistake, I didn't spot the "UnicodeStr" routine in your source code.
Siekmanski,
yes
invoke MultiByteToWideChar,CP_ACP,0,ADDR image_name,-1,ADDR UnicodeFileName,MAX_PATH-1
works
The buffer for the unicodename has to be at least twice the size of len image_name
So, of course I don't understand the "MultiBytetoWideChar function" , but it is MS (and not some unknown programmer) and we all have the hightest trust into its functions ...
Here is the zip
Don't know where I found it, but in this forum somewhere
Quote from: clamicun on May 19, 2017, 12:45:49 AMnot some unknown programmer) and we all have the hightest trust into its functions ...
The unknown programmer is most probably Erol (http://www.masmforum.com/board/index.php?topic=15407.msg126060#msg126060) (and I have the highest trust into his functions :P)
jj,
of course I was referring to MS when I used the expression "highest trust"
Quote from: clamicun on May 19, 2017, 12:55:27 AM
Here is the zip
Don't know where I found it, but in this forum somewhere
UnicodeStr.asm is in the attachment to the post where the
Erol link above points to.