Неправильно передается handle

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by HighExcel, 5 Jul 2010.

  1. HighExcel

    HighExcel Well-Known Member

    Joined:
    2 Aug 2007
    Messages:
    43
    Likes Received:
    354
    Reputations:
    6
    Есть 2 программы. Одна пишется в среде C++ Builder 6, другая в QT.

    нужно передать handle объекта Panel1 в файл, чтобы вторая программа взяла его оттуда и вывела на этот объект свои данные.

    хэндл записывается в файл, но программа QT не находит его. в чем ошибка? подскажите, альтернативные пути решения. нет желания переносить всю первую прогу в другую среду
     
  2. b0r2

    b0r2 Member

    Joined:
    29 Jun 2010
    Messages:
    30
    Likes Received:
    5
    Reputations:
    0
    Я конечно не такой уж и суперпрограммер на платформе win32, но если не ошибаюсь та Panel1 находится в адресной пространстве другой программы,поэтому думаю что чужая программа не будет иметь право записать туда свои данные.
    Но есть один универсальный способ манипулирования чужыми окнами в Виндовс,это сообщения,так что копай в сторону SendMessage().
     
    #2 b0r2, 5 Jul 2010
    Last edited: 5 Jul 2010
    1 person likes this.
  3. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    HighExcel
    ваши адреса не валидны в чужом адресном пространстве например
    у вас по виртуальному адресу 0xBADC0DE который мапится на физический
    0xBADC0DA объект определенного типа а в другом процессе по
    этому же виртуальному адресу 0xBADC0DE но который мапится на совсем
    другой физический адрес 0xBADC0DC совсем другие данные из другой
    области совершенно поэтому ваши виртуальные адреса в чужом процессе
    не валидные они мапятся на совершенно разные физические адреса
    вот некоторые механизмы через которые можно передавать данные
    между процессами
    DDE клиент - сервер сделать или CLIPBOARD через буфер обмена можно обменятся
    или юзать WM_COPYDATA тоже неплохо при определенных
    сценариях помогает или PIPE именнованные каналы для обмена сообщениями или
    FILEMAPPING открыть проекцию в другом процессе и все
    ну и погуглить на самом деле больше возможностей
     
    1 person likes this.
  4. 1nax

    1nax New Member

    Joined:
    24 May 2009
    Messages:
    6
    Likes Received:
    1
    Reputations:
    0
    panel1 это что за объект, окно? какой функцией ты получаешь этот handle?
     
    1 person likes this.
  5. HighExcel

    HighExcel Well-Known Member

    Joined:
    2 Aug 2007
    Messages:
    43
    Likes Received:
    354
    Reputations:
    6
    Panel1 это объект для вывода различной мультимедиа инфы. У меня там отображается видео

    FILE *file;
    file = fopen("handle.dat","wb");
    HANDLE h = Panel1->Handle;
    fwrite(&h, sizeof(h),1,file);
    fclose(file);



    greki_hoy, спасибо, погуглю
     
  6. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    или так
    Code:
    #pragma data_seg("Shared")
    DWORD Code = 0xBADC0DE;
    #pragma data_seg()
    
    #pragma comment(linker, "/SECTION:Shared,RWS")
    
     
  7. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Делать вам нечего...файлы...адреса...процессы....делается элементарно :
    Ищется окно программы которой хэндл панельки скинуть надо, на него отправляется сообщение к примеру WM_USER+0x100, в lparam хэндл панельки, в rparam 0 и всё.
    (Соответственно нужно добавить на стороне второго приложения в то окно обрабтчик сообщения WM_USER+0x100)
     
  8. b0r2

    b0r2 Member

    Joined:
    29 Jun 2010
    Messages:
    30
    Likes Received:
    5
    Reputations:
    0
    А разве об этом уже не говорилось ? :)
     
  9. xa-xa89

    xa-xa89 Elder - Старейшина

    Joined:
    17 May 2008
    Messages:
    108
    Likes Received:
    27
    Reputations:
    2
    Можно попробовать через именованные каналы, реализовать
    http://ru.wikipedia.org/wiki/%D0%98%D0%BC%D0%B5%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BA%D0%B0%D0%BD%D0%B0%D0%BB
     
  10. \\ChaOs//

    \\ChaOs// Member

    Joined:
    26 Feb 2009
    Messages:
    102
    Likes Received:
    26
    Reputations:
    5
    Каким образом хэндл может быть в адресном пространстве программы? Хэндл - это объект ядра. Учите матчасть.

    И не забывайте про функции CloseHandle, DuplicateHandle и иже с ними.
     
  11. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    ну тогда DuplicateHandle но то что ты скопируеш описатель в таблицу описателей нужного процесса еще не все он ничего не знает о нем надо как то передать значение хендла а тут самое простое теже сообщения виндовс ну или любой другой механизм чтоб он работать с объектом смог у себя

    зы это бы давно предложили если бы ТС спросил именно про это
     
  12. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    используй функцию DublicateHandle()