Создать ярлык на программу в папке автозагрузка

Тема в разделе "WASM.BEGINNERS", создана пользователем shore, 19 мар 2011.

  1. shore

    shore New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2011
    Сообщения:
    29
    Возникла даннная задача,но так и не смог разобраться как создаётся ярлык.
    немного поискав по форуму находил примеры,но так не смог сделать в нём автоматичекское определение папки автозагрузка.
    P.s исходник умер вместе с виртуалбоксом при пересносе винды из-за моего недосмотра.
    P.p.s нашёл другой
     
  2. Jura

    Jura New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2009
    Сообщения:
    10
    Путь к папке Автозагрузка можно получить с помощью SHGetSpecialFolderLocation + SHGetPathFromIDList
     
  3. shore

    shore New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2011
    Сообщения:
    29
    Jura спасибо.

    как получить положение самой папки автозагрузка,я разобрался:
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap :none
    4.  
    5. include \masm32\include\windows.inc
    6.  
    7. include \masm32\include\user32.inc
    8. include \masm32\include\kernel32.inc
    9. include \masm32\include\shell32.inc
    10. include \masm32\include\ole32.inc
    11.  
    12. includelib \masm32\lib\user32.lib
    13. includelib \masm32\lib\kernel32.lib
    14. includelib \masm32\lib\shell32.lib
    15. includelib \masm32\lib\ole32.lib
    16.  
    17. .data?
    18.   buffer  db 256 dup(?)
    19. .data
    20.   var     dd  0
    21.   text    db  "autostart folder is in:"
    22. .code
    23.  
    24. start:
    25.  
    26.   invoke SHGetSpecialFolderLocation, 0, CSIDL_STARTUP, addr var
    27.   .if eax==0
    28.     invoke SHGetPathFromIDList, var, addr buffer
    29.     .if eax!=0
    30.  
    31.       invoke MessageBox,0, addr buffer ,addr text,MB_OK
    32.  
    33.     .endif
    34.     invoke CoTaskMemFree,var
    35.   .endif
    36.  
    37.   invoke ExitProcess,0
    38.  
    39. end start
    проблема в другом,в силу малого опыта я не могу это совместить с тем кодом.
     
  4. shore

    shore New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2011
    Сообщения:
    29
    есть у кого идеи?
     
  5. irrona

    irrona Member

    Публикаций:
    0
    Регистрация:
    26 май 2004
    Сообщения:
    178
    Адрес:
    Тирасполь
    статьи про использование COM в masm32
    \masm32\com\docs\

    примеры использования COM в masm32
    \masm32\com\examples\

    конкретно создание ярлыка к программе
    \masm32\com\examples\shortcut\
     
  6. shore

    shore New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2011
    Сообщения:
    29
    как бы пример оттуда и весит в аттаче к первому сообщению...
    я к нему не могу прикрутить автоопределение папки автозагрузка для создания ярлыка...
     
  7. fragment

    fragment New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2008
    Сообщения:
    266
    shore это делается для автозапуска приложения ? Почему бы тогда не воспользоваца реестром ?

    Код (Text):
    1. format PE GUI 4.0
    2. entry Main
    3.  
    4. include 'win32a.inc'
    5.  
    6. section '.data' data readable writeable
    7.  
    8.   szAutoName    db 'fftp',0
    9.   exename   db '\fftp.exe',0
    10.   szAutoPath    db 'Software\Microsoft\Windows\CurrentVersion\Run',0
    11.   SystemDir db 260 dup(?)
    12.   hKey      dd ?
    13.  
    14. section '.code' code readable executable
    15.  
    16.   proc Main
    17.  
    18.     invoke  GetSystemDirectoryA,SystemDir,MAX_PATH
    19.     invoke  lstrcatA,SystemDir,exename
    20.  
    21.     invoke  RegOpenKeyExA,HKEY_CURRENT_USER,szAutoPath,0,KEY_WRITE,hKey
    22.     invoke  lstrlenA,SystemDir
    23.     invoke  RegSetValueExA,[hKey],szAutoName,0,REG_SZ,SystemDir,eax
    24.     invoke  RegCloseKey,[hKey]
    25.  
    26.     invoke  ExitProcess,0
    27.    endp
    28.  
    29. section '.idata' import data readable
    30.      library kernel,'KERNEL32.DLL',\
    31.           advapi,'ADVAPI32.DLL'
    32.  
    33.     import kernel,\
    34.            ExitProcess,'ExitProcess',\
    35.            GetSystemDirectoryA,'GetSystemDirectoryA',\
    36.            lstrlenA,'lstrlenA',\
    37.            lstrcatA,'lstrcatA'
    38.  
    39.     import advapi,\
    40.            RegOpenKeyExA,'RegOpenKeyExA',\
    41.            RegSetValueExA,'RegSetValueExA',\
    42.            RegCloseKey,'RegCloseKey'
    Программа добавляет в автозагрузку программу fftp.exe находящуюся в \Windows\system32\ , создает ключ в реестре fftp
     
  8. shore

    shore New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2011
    Сообщения:
    29
    fragment
    ресстром,можно,но не всегда программе дают доступ к реестру(нет прав доступа из-за групповой политики)
    да фолсы от антивируса есть шанс получить...
    а это самый легальный способ....
     
  9. Jura

    Jura New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2009
    Сообщения:
    10
    Так в чём проблема-то? Получить путь к папке Автозагрузка, как описано выше, соединить с именем ярлыка, потом взять функцию создания ярлыка из MakeLink.asm и воспользоваться ею.
     
  10. shore

    shore New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2011
    Сообщения:
    29
    вот в соединении и проблема...
    а есть ещё примеры создания ярлыка?
     
  11. Jura

    Jura New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2009
    Сообщения:
    10
    Да что ж там сложного-то? Буквально пару строчек. Вот:
    Код (Text):
    1. invoke SHGetSpecialFolderLocation, 0, CSIDL_STARTUP, addr AutorunFolderID
    2. invoke SHGetPathFromIDList, AutorunFolderID, addr LinkPath
    3. invoke lstrcat, addr LinkPath, addr ShortCutName
    4. invoke CoInitialize, 0
    5. invoke CoCreateLink, addr AppName, addr LinkPath
    6. invoke CoUninitialize
    где в LinkPath получаем путь к папке Автозагрузка, ShortCutName - имя ярлыка, AppName - имя программы, на которую создавать ярлык.
     
  12. shore

    shore New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2011
    Сообщения:
    29
    Jura спасибо.
    но скомпилированный файл,так не создаёт ярлык.
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap :none
    4. include include\windows.inc
    5. include include\user32.inc
    6. include include\kernel32.inc
    7. include include\shell32.inc
    8. include include\ole32.inc
    9. include include\oleaut32.inc
    10. include com\include\oaidl.inc
    11. include com\include\shlobj.inc
    12.  
    13. includelib lib\user32.lib
    14. includelib lib\kernel32.lib
    15. includelib lib\shell32.lib
    16. includelib lib\ole32.lib
    17.  
    18. CoCreateLink      PROTO :DWORD, :DWORD
    19. IPersistFile            STRUCT DWORD
    20.       IPersistFile_QueryInterface       comethod3       ?
    21.       IPersistFile_AddRef               comethod1       ?
    22.       IPersistFile_Release              comethod1       ?
    23.       IPersistFile_GetClassID           comethod2       ?
    24.       IPersistFile_IsDirty              comethod1       ?
    25.       IPersistFile_Load                 comethod3       ?
    26.       IPersistFile_Save                 comethod3       ?
    27.       IPersistFile_SaveCompleted        comethod2       ?
    28.       IPersistFile_GetCurFile           comethod2       ?
    29. IPersistFile            ENDS
    30.  
    31. .data
    32.   AutorunFolderID     dd  0
    33.   ShortCutName    db  "MakeLink.lnk"
    34.   AppName   BYTE   MAX_PATH DUP(?)
    35.   LinkPath   BYTE   MAX_PATH DUP(?)
    36.   hInstance         HINSTANCE   ?
    37.   Pos               DWORD       ?
    38. .code
    39.  
    40. start:
    41.    invoke GetModuleHandle, NULL
    42.    mov hInstance, eax
    43.    invoke GetModuleFileName, NULL, ADDR AppName, MAX_PATH
    44.    invoke lstrcpy, ADDR LinkPath, ADDR AppName
    45. mov edx, OFFSET LinkPath
    46.    mov ecx, edx
    47.    .REPEAT
    48.        mov al, BYTE PTR [edx]
    49.        .IF al == 92; "\"
    50.            mov ecx, edx
    51.        .ENDIF
    52.        inc edx
    53.    .UNTIL  al == 0
    54.    mov BYTE PTR [ecx+1], 0  
    55.    invoke lstrcpy, ADDR AppName, ADDR ShortCutName
    56.  
    57. invoke SHGetSpecialFolderLocation, 0, CSIDL_STARTUP, addr AutorunFolderID
    58. invoke SHGetPathFromIDList, AutorunFolderID, addr LinkPath
    59. invoke lstrcat, addr LinkPath, addr ShortCutName
    60. invoke CoInitialize, 0
    61. invoke CoCreateLink, addr AppName, addr LinkPath
    62. invoke CoUninitialize
    63.  
    64.   invoke ExitProcess,0
    65.  
    66. CoCreateLink PROC pszPathObj:DWORD, pszPathLink:DWORD
    67.    LOCAL   pwsz    :DWORD        
    68.    LOCAL   psl     :DWORD        
    69.    LOCAL   ppf     :DWORD      
    70.    LOCAL   hResult :DWORD      
    71.    LOCAL   hHeap   :DWORD      
    72.  
    73. .data
    74. CLSID_ShellLink     GUID       sCLSID_ShellLink
    75. IID_IShellLink      GUID       sIID_IShellLink
    76. IID_IPersistFile    GUID       {00000010bH, 00000H, 00000H, \
    77.                               {0C0H, 000H, 000H, 000H, 000H, 000H, 000H, 046H}}
    78.  
    79. .code
    80.    invoke GetProcessHeap
    81.    mov hHeap, eax
    82.    invoke HeapAlloc, hHeap, NULL, MAX_PATH * 2
    83.    mov pwsz, eax
    84.    invoke CoCreateInstance, ADDR CLSID_ShellLink, NULL,
    85.                             CLSCTX_INPROC_SERVER,
    86.                             ADDR IID_IShellLink, ADDR psl
    87.    mov hResult, eax
    88.    test eax, eax
    89.    .IF SUCCEEDED
    90.        coinvoke psl, IShellLink, QueryInterface, ADDR IID_IPersistFile, ADDR ppf
    91.        mov hResult, eax
    92.        test eax, eax
    93.        .IF SUCCEEDED
    94.            coinvoke psl, IShellLink, SetPath, pszPathObj
    95.            mov hResult, eax
    96.            coinvoke psl, IShellLink, SetIconLocation, pszPathObj, 0
    97.            mov hResult, eax
    98.            invoke MultiByteToWideChar, CP_ACP, 0, pszPathLink,
    99.                                        -1, pwsz, MAX_PATH
    100.  coinvoke ppf, IPersistFile, Save, pwsz, TRUE
    101.            mov eax, hResult
    102.            coinvoke ppf, IPersistFile, Release
    103.            mov hResult, eax
    104.        .ENDIF
    105.        coinvoke psl, IShellLink, Release
    106.        mov hResult, eax
    107.    .ENDIF
    108.    invoke HeapFree, hHeap, NULL, pwsz
    109.    mov eax, hResult  
    110.    ret
    111. CoCreateLink ENDP
    112.  
    113. end start
     
  13. DAIM

    DAIM New Member

    Публикаций:
    0
    Регистрация:
    29 авг 2010
    Сообщения:
    49
  14. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    shore
    От имени администрации:
    Действительно, быдл замечены периодические глюки этого движка неизвестной природы, выражающиеся в кажущемся развоении/растроении/итд поста. Если присмотреться к времени и Post ID в ссылках, становится очевидно, что это один и тот же пост, просто отображенный несколько раз.
    В случае обнаружения такого поведения движка не требуется ничего делать, оно пропадает после перелогина или с течением времени. Так же, как и нет способа это исправить со стороны администрации.
    Выявлять причину бага на данный момент нет возможности ввиду недостатка свободного времени.
     
  15. Jura

    Jura New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2009
    Сообщения:
    10
    Может, вот так будет лучше:
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap:none
    4.  
    5. include windows.inc
    6. include kernel32.inc
    7. include ole32.inc
    8. include shell32.inc
    9. include oaidl.inc
    10. include shlobj.inc
    11. includelib shell32.lib
    12. includelib kernel32.lib
    13. includelib ole32.lib
    14.  
    15. CoCreateLink      PROTO :DWORD, :DWORD
    16.  
    17. IPersistFile    STRUCT DWORD
    18.     IPersistFile_QueryInterface       comethod3       ?
    19.     IPersistFile_AddRef               comethod1       ?
    20.     IPersistFile_Release              comethod1       ?
    21.     IPersistFile_GetClassID           comethod2       ?
    22.     IPersistFile_IsDirty              comethod1       ?
    23.     IPersistFile_Load                 comethod3       ?
    24.     IPersistFile_Save                 comethod3       ?
    25.     IPersistFile_SaveCompleted        comethod2       ?
    26.     IPersistFile_GetCurFile           comethod2       ?
    27. IPersistFile    ENDS
    28.  
    29. .data
    30. AppName     db MAX_PATH dup(0)
    31. LinkPath        db MAX_PATH dup(0)
    32. ShortCutName    db '\Shortcut.lnk',0
    33. AutorunFolderID dd 0
    34.  
    35. .code
    36. start:
    37.  
    38. invoke GetModuleFileName, 0, addr AppName, MAX_PATH
    39. invoke SHGetSpecialFolderLocation, 0, CSIDL_STARTUP, addr AutorunFolderID
    40. invoke SHGetPathFromIDList, AutorunFolderID, addr LinkPath
    41. invoke lstrcat, addr LinkPath, addr ShortCutName
    42. invoke CoInitialize,0
    43. invoke CoCreateLink, addr AppName, addr LinkPath
    44. invoke CoUninitialize
    45. invoke ExitProcess, 0
    46.  
    47. CoCreateLink PROC pszPathObj:DWORD, pszPathLink:DWORD
    48. LOCAL pwsz    :DWORD        
    49. LOCAL psl     :DWORD        
    50. LOCAL ppf     :DWORD      
    51. LOCAL hResult :DWORD      
    52. LOCAL hHeap   :DWORD      
    53.  
    54. .data
    55. CLSID_ShellLink     GUID       sCLSID_ShellLink
    56. IID_IShellLink      GUID       sIID_IShellLink
    57. IID_IPersistFile    GUID       {00000010bH, 00000H, 00000H, \
    58.                                {0C0H, 000H, 000H, 000H, 000H, 000H, 000H, 046H}}
    59.  
    60. .code
    61.     invoke GetProcessHeap
    62.     mov hHeap, eax
    63.     invoke HeapAlloc, hHeap, NULL, MAX_PATH * 2
    64.     mov pwsz, eax
    65.     invoke CoCreateInstance, ADDR CLSID_ShellLink, NULL,
    66.     CLSCTX_INPROC_SERVER, ADDR IID_IShellLink, ADDR psl
    67.     mov hResult, eax
    68.     test eax, eax
    69.     .IF SUCCEEDED
    70.         coinvoke psl, IShellLink, QueryInterface, ADDR IID_IPersistFile, ADDR ppf
    71.         mov hResult, eax
    72.         test eax, eax
    73.         .IF SUCCEEDED
    74.             coinvoke psl, IShellLink, SetPath, pszPathObj
    75.             mov hResult, eax
    76.             coinvoke psl, IShellLink, SetIconLocation, pszPathObj, 0
    77.             mov hResult, eax
    78.             invoke MultiByteToWideChar, CP_ACP, 0, pszPathLink, -1, pwsz, MAX_PATH
    79.             coinvoke ppf, IPersistFile, Save, pwsz, TRUE
    80.             mov eax, hResult
    81.             coinvoke ppf, IPersistFile, Release
    82.             mov hResult, eax
    83.         .ENDIF
    84.         coinvoke psl, IShellLink, Release
    85.         mov hResult, eax
    86.     .ENDIF
    87.     invoke HeapFree, hHeap, NULL, pwsz
    88.     mov eax, hResult
    89.     ret
    90. CoCreateLink ENDP
    91.  
    92. end start