Получение нестандартных аргументов командной строки

Тема в разделе "WASM.WIN32", создана пользователем _Sysman_, 19 дек 2004.

  1. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    cresta

    С PostMessage лучше. Только я стал бы помещать его внутрь DownloadProc чтобы качалка не зависела от типа приложения.



    Если закачка должна осуществляться не внешней программой, то я бы сделал так
    Код (Text):
    1. THPARAM struc
    2.   src   dd   ?
    3.   dst   dd   ?
    4.   sop   dd   ?
    5.   hwnd  HWND NULL
    6. THPARAM ends
    7.  
    8. .data
    9.   dwStop   dd      0
    10.   thHandle HANDLE  NULL
    11.   thParam  THPARAM <NULL, NULL, NULL>
    12.  
    13. .code
    14.   ...
    15.  
    16.   local thId : dword
    17.  
    18.   ...
    19.  
    20. ; при получении команды запустить закачку
    21.   mov thParam.src, <адрес строки с именем исходного файла>
    22.   mov thParam.dst, <адрес строки с именем результирующего файла>
    23.   mov thParam.stop, offset dwStop
    24.   mov thParam.hwnd, <дескриптор окна ждущего сообщения>
    25.   mov dwStop,0
    26.   invoke CreateThread, NULL, 0, offset Thread, addr thParam, 0, addr thId
    27.   mov thHandle,eax
    28.  
    29.   ...
    30.  
    31. ; где-то в программе необходимо завершить поток
    32. ; независимо от успешности закачки,
    33. ; например, пользователь завершает работу основной программы
    34. .if thHandle != NULL
    35.     mov dwStop,1
    36.     invoke WaitForSingleObject, thHandle, INFINITE
    37.     invoke CloseHandle, thHandle
    38.     mov thHandle,NULL
    39.   .endif
    40.  
    41.  ...
    42.  
    43. Thread proc uses ebx edi, Param : ptr THPARAM
    44.  
    45.   local thHandle : HANDLE
    46.   local dwResult : dword
    47.   local thId     : dword
    48.   local stop     : dword
    49.   local thParam  : THPARAM
    50.  
    51.   mov dwResult,WAIT_TIMEOUT
    52.  
    53.   mov edi,Param
    54.   mov ebx,THPARAM ptr [edi]).stop
    55.  
    56.   lea eax,thParam
    57.   push (THPARAM ptr [edi]).src
    58.   pop (THPARAM ptr [eax]).src
    59.   push (THPARAM ptr [edi]).dst
    60.   pop (THPARAM ptr [eax]).dst
    61.   lea ecx,stop
    62.   mov dword ptr [ecx],0
    63.   mov (THPARAM ptr [eax]).stop,ecx
    64.   mov (THPARAM ptr [eax]).hwnd,NULL
    65.  
    66.   invoke CreateThread, NULL, 0, offset Download, addr thParam, 0, addr thId
    67.   mov thHandle,eax
    68.   .if eax != NULL
    69.     .while (dword ptr [ebx] == 0) && (dwResult == WAIT_TIMEOUT)
    70.       invoke WaitForSingleObject, thHandle, 500
    71.       mov dwResult,eax
    72.     .endw
    73.  
    74.     .if dwResult == WAIT_OBJECT_0
    75.       invoke PostMessage, (THPARAM ptr [edi]).hwnd,\
    76.                           WM_COMMAND, IDM_DOWNLOAD_DONE, 0
    77.     .else
    78.       invoke PostMessage, (THPARAM ptr [edi]).hwnd,\
    79.                           WM_COMMAND, IDM_DOWNLOAD_FAIL, 0
    80.     .endif
    81.     mov stop,1
    82.     invoke WaitForSingleObject, thHandle, INFINITE
    83.     invoke CloseHandle, thHandle
    84.   .else
    85.       invoke PostMessage, (THPARAM ptr [edi]).hwnd,\
    86.                           WM_COMMAND, IDM_DOWNLOAD_FAIL, 0
    87.   .endif  
    88.   ret
    89. Thread endp
    90.  
    91. Download proc Param : THPARAM
    92. ; Используя, например, [i]WinINet API[/i] качаю файл
    93. ; чтобы прервать закачку в любой момент
    94. ; в цикле получения кусков проверяю Param.stop
    95. Download endp
     
  2. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    q_q



    Да вроде так и написано...:)





    Возможно, что я бы сделал тоже примерно так, вот только один момент: автор упомянул, что прога написана не на asm и не на Си, из наиболее распространенных остаются дельфи и VB, отсюда: довольно большая вероятность, что пишется на VB. Если это так, то попытка запустить в программе отдельный поток, и в добавок из него ещё один поток практически наверняка вызовет падение программы. Сам намучался немеряно с потоками из vb, поэтому и предложил удалить процедуру с вызовом CreateThread в dll. Такая схема работает устойчиво.

    Касательно Param.stop - полезный момент.
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    cresta

    Да вроде так и написано

    Ты забыл свой код? Пробублирую
    Код (Text):
    1. из [b]DownloadProc:[/b]
    2. invoke URLDownloadToFile
    3. invoke [b]PostMessage[/b],hWnd,WM_USER.......
    4. ret




    Не верю что в VB все так плохо. Хотя утверждать что все хорошо тоже не могу, т.к. использую только VBA для автоматизации MsOffic'а.



    VB ... попытка запустить в программе отдельный поток, и в добавок из него ещё один поток практически наверняка вызовет падение программы

    Поэтому и предлагаю запускать один поток, а из него CreatePrecess.



    Вообще поток из потока я использовал чтобы код качал не зависел от типа (gui/con) приложеня. Качать можно в первом потоке.
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    q_q



    Не забыл :), а вот ты возможно пропустил "не" в своей фразе
    . :)) Если сделать отмену, то лучше убрать из DownloadProc



    vb даже с одним потоком может рухнуть, не говоря о запуске из одного потока другого.

    Из API-Guide:

    'Using the CreateThread function in Visual Basic

    'is very risky! VB5 is 'kinda' stable, but VB6

    'applications will probably crash when you

    'use the CreateThread function.



    Что к сожалению, часто подтверждается на практике :dntknw: А зная, что такой исход весьма вероятен, приходится делать такие вещи, как вынос потока в dll.

    Автор вопроса точно не сказал, что за яву, поэтому такие предположения и страховки.
     
  5. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    cresta

    а вот ты ... пропустил

    Точно.