WINAMP: load playlist через SendMessagу-не понятно почему работает

Тема в разделе "Разработка плагинов", создана пользователем gershkovich, 3 ноя 2008.

  1. gershkovich

    gershkovich New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2006
    Сообщения:
    97
    Всем привет!

    Объясните почему работает

    Мое приложение должно загрузить playlist в WINAMP.
    Для этого надо передать указатель на строку - путь к playlist-у посредством SendMessage.
    Я знаю что строки (вернее их указатели) между процессами просто так передавать нельзя.
    На сайте WINAMP-а прямо так и сказано. Надо делать плагин, чтоб он работал в адресном
    контексте WINAMP-а.
    Я начал было уже мудрить с плагинами для WINAMP-а, file mapping, синхронизацией процессов и т.д.
    как вдруг обнаружил, что можно обойтись без всего этого (!!!):

    Код (Text):
    1. section '.data'
    2.     cd COPYDATASTRUCT
    3.     televizor db 'D:\televizor.m3u', 0
    4.  
    5. section '.code'
    6.  
    7.     ; заполняем структуру
    8.     mov ebx, cd
    9.     mov dword [ebx + COPYDATASTRUCT.dwData], 100 ; ID комманды
    10.     mov dword [ebx + COPYDATASTRUCT.cbData], 17 ; длина пути + 1 байт
    11.     mov dword [ebx + COPYDATASTRUCT.lpData], televizor; указатель на путь
    12.  
    13.     ; load play list (WM_COPYDATA = 04Ah)
    14.     invoke SendMessage, [winamp_handle], 04Ah, 0, cd
    Как такое может быть ? Ведь адрес строки в адресном пространстве моего приложения
    не актуален в пространстве WINAMP-а. Тем не менее вышеприведенный код работает.

    Это какая то аномалия или так должно быть ?
    Заранее спасибо.
     
  2. Dian

    Dian Member

    Публикаций:
    0
    Регистрация:
    19 июн 2008
    Сообщения:
    222
    Не, всё пучком. Смотри описание WM_COPYDATA - там идет копирование между адресными простанствами
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    А ты и не передаешь свой адрес в конечную команду. WM_COPYDATA копирует данные сама.