Hi,
Need a help for "Create a shortcut" example from https://masm32.com/board/index.php?topic=12059.0 (https://masm32.com/board/index.php?topic=12059.0)
Quoteinclude \masm32\MasmBasic\MasmBasic.inc ; ## COM demo: create shortcut ##
include IShellLink.inc
; credits to Gerardo Friedrich (BiteRider), Jaymeson Trudgen (NaN) and Ernest Murphy (source)
.code
CreateSC proc pPathObj, pPathLink
LOCAL WebInterface, pIPersistFile
lea edi, WebInterface
pIShellLink equ dword ptr [edi]
.if rv(CoCreateInstance, offset CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, offset IID_IShellLink, edi)==S_OK
CoInvoke pIShellLink, IShellLinkWVtbl.QueryInterface, addr IID_IPersistFile, addr pIPersistFile
.if eax==S_OK
CoInvoke pIShellLink, IShellLinkWVtbl.SetPath, pPathObj
CoInvoke pIShellLink, IShellLinkWVtbl.SetIconLocation, pPathObj, 0
.if eax==S_OK
CoInvoke pIPersistFile, IPersistFileVtbl.Save, pPathLink, TRUE
PrintLine Str$("Done, result=%i", eax)
.endif
.endif
.endif
ret
CreateSC endp
SetGlobals src$, lnk$
Init
.if rv(OleInitialize, NULL)==S_OK
wLet src$=wRec$(MbExeFolder$)+"ShortCut.asc"
wLet lnk$=wRec$(MbExeFolder$)+"ScSource.lnk"
invoke CreateSC, src$, lnk$
invoke OleUninitialize
.endif
EndOfCode
I could not understand and compile this example because there are no comments and it is written in a language unknown to me.
Is it possible for someone to translate it to MASM64, so I can compile it?
Thanks in advance :thumbsup:
Hi 'ognil', that is written in "MasmBasic", written and maintained by a member here (jj2007) and has it's own forum section, so I have moved your post to that section :smiley:
Sorry Admin, for posting in the wrong forum. I was just following the advice of
zedd151 from here: https://masm32.com/board/index.php?topic=12262.0 (https://masm32.com/board/index.php?topic=12262.0)
Quoteby zedd151
One thing that you can do for yourself ognil, is make a posting in The Campus with any questions that you have about 64 bit assembly programming for Windows. :thumbsup: You should receive better responses there, than simply inquiring in an introductory post.
Thank you
Sorry ognil, I should have said 'with any general questions'. Your request is somewhat specific, as not all members here use MasmBasic. It will be better served here. :smiley: No one knows better how MasmBasic works than jj2007. :biggrin:
Yes, JJ's the one to handle this.
Just to clue you in, MasmBasic is a dialect of BASIC that's actually assembly language (MASM-based) with a lot of stuff added on top of it, to allow you to use BASIC statements or assembly operations or a mix of both. I don't use it myself, but it's a great tool for those who like this kind of programming. One nice thing is that it's an IDE (integrated development environment), so you can edit, assemble and link all within the same application.
Admin and NoCforMe opened my eyes to what MasmBasic is.
Thank you guys. :thumbsup:
QuoteSorry Admin, for posting in the wrong forum. I was just following the advice of
No need for apologies :smiley:
As 'zedd' suggested correctly, the Campus IS a good place to ask questions,
especially for people learning assembler.
Quote from: ognil on September 18, 2024, 05:43:33 AMI could not understand and compile this example because there are no comments and it is written in a language unknown to me.
Most commands, e.g. CoInvoke (https://www.jj2007.eu/MasmBasicQuickReference.htm#Mb1138) and wLet (https://www.jj2007.eu/MasmBasicQuickReference.htm#Mb1248), are explained in MasmBasic's help file. You need to install the package (http://masm32.com/board/index.php?topic=94.0).
QuoteIs it possible for someone to translate it to MASM64, so I can compile it?
From what I see, you would be able to do it. Just take the example and port it...
Something like
wLet lnk$=wRec$(MbExeFolder$)+"ScSource.lnk"
is obviously not available in the Masm64 SDK, so you need to use buffers, MultiByteToWideChar etc
Thank you
JJ,
About
MasmBasic, according to
NoCforMe:
QuoteI don't use it myself, but it's a great tool ...
My university experience is with C++, MASM64, PHP, js, HTML5, CSS3 and Visual Studio as IDE.
At this stage, I prefer to invest my time in mastering these languages rather than learning new ones.
My expectations of getting a working MASM64 code were not met, but I solved the problem in my own way:
- I found the C++ source code from MS
https://learn.microsoft.com/en-us/windows/win32/shell/links#creating-a-shortcut-and-a-folder-shortcut-to-a-file
- I translated it to MASM64 and VoilĂ ...
Attachment is here:
https://masm32.com/board/index.php?topic=12272.0 (https://masm32.com/board/index.php?topic=12272.0)
; MSDN example
; https://learn.microsoft.com/en-us/windows/win32/shell/links#creating-a-shortcut-and-a-folder-shortcut-to-a-file
include \masm32\include64\masm64rt.inc
.data
;********************************************
IID_IShellLinkA dd 214EEh
dw 0,0,0c0h
db 0,0,0,0,0,46h
;********************************************
IID_IShellLinkW dd 214F9h
dw 0,0,0c0h
db 0,0,0,0,0,46h
;********************************************
CLSID_ShellLink dd 21401h
dw 0,0,0c0h
db 0,0,0,0,0,46h
;********************************************
IID_IPersistFile dd 10bh
dw 0,0,0c0h
db 0,0,0,0,0,46h
;********************************************
pIShellLink dq 0
ppf dq 0
lpszPathLink dw "t","o","N","o","t","e","p","a","d",".","l","n","k",0,0,0,0
lpszPathObj db "C:\Windows\System32\notepad.exe",0
lpszDesc db "Shortcut to Notepad",0
;*******************************************************************;
.code
main proc
xor ecx, ecx
mov edx, 2
call CoInitializeEx
call Shortcut
call CoUninitialize
xor ecx, ecx
call ExitProcess
main endp
;*******************************************************************;
Shortcut proc
lea rax, pIShellLink ; Result -> IID_IShellLinkW interface
lea r9, IID_IShellLinkA
mov [rsp+4*8], rax
mov r8d, 1 ; 1 = CLSCTX_INPROC_SERVER
xor edx, edx
lea rcx, CLSID_ShellLink
call CoCreateInstance
test eax, eax ; eax = 0 -> Success
jne Ret_0 ; return FALSE
mov rcx, pIShellLink ; IID_IShellLinkW interface
lea r8, ppf ; Result -> IID_IPersistFile interface
mov rax, [rcx] ; rax -> Vtbl with methods
lea rdx, IID_IPersistFile
call qword ptr [rax+0*8] ; IID_IShellLinkW::QueryInterface method = 0*8
test eax, eax ; eax = 0 -> Success
jne Ret_B ; return FALSE
mov rcx, pIShellLink ; IID_IShellLinkW interface
mov rax, [rcx] ; IID_IShellLink::IShellLinkAVtbl
lea rdx, lpszPathObj ; Pointer to ANSI string
call qword ptr [rax+20*8] ; IID_IShellLinkW::SetPath method in IShellLinkA = 20*8
test eax, eax ; eax = 0 -> Success
jne Ret_A
mov rcx, pIShellLink ; IID_IShellLinkW interface
lea rdx, lpszDesc ; Pointer to ANSI string
mov rax, [rcx] ; IID_IShellLinkW::IShellLinkWVtbl ; Vtbl with methods
call qword ptr [rax+7*8] ; IID_IShellLinkW::SetDescription method in IShellLinkAVtbl = 7*8
test eax, eax ; eax = 0 -> Success
jne Ret_A
mov rcx, ppf ; IID_IPersistFile interface
lea rdx, lpszPathLink ; Pointer to Unicode string
xor r8d, r8d ; fRemember parameter = 0
mov rax, [rcx] ; IID_IPersistFile::Vtbl with methods
call qword ptr [rax+6*8] ; IID_IPersistFile::Save method = 6*8
test eax, eax ; eax = 0 -> Success
jne Ret_A
; ppf->Release()
mov rcx, ppf ; IID_IPersistFile interface
mov rax, [rcx] ; IID_IPersistFile::Vtbl with methods
call qword ptr [rax+2*8] ; IID_IPersistFile::Release method
; pIShellLink->Release()
mov rcx, pIShellLink ; IID_IShellLinkW interface
mov rax, [rcx] ; IID_IShellLinkW::IShellLinkWVtbl ; Vtbl with methods
call qword ptr [rax+2*8] ; IID_IShellLinkW::Release method
mov eax, 1 ; Return 1 -> success
ret
Ret_A:
; ppf->Release()
mov rcx, ppf ; IID_IPersistFile interface
mov rax, [rcx] ; Vtbl with methods
call qword ptr [rax+2*8] ; IID_IPersistFile::Release method
Ret_B:
; pIShellLink->Release()
mov rcx, pIShellLink ; IID_IShellLinkW interface
mov rax, [rcx] ; Vtbl with methods
call qword ptr [rax+2*8] ; IID_IShellLinkW::Release method
Ret_0:
xor eax, eax ; Error -> return FALSE
ret
Shortcut endp
;*******************************************************************;
end
Quote from: ognil on September 19, 2024, 10:53:05 PMAttachment is here:
https://masm32.com/board/index.php?topic=12272.0
My compliments :thumbsup: