Хелп... Непонятный сабклассинг в .NET2.0

Тема в разделе "WASM.WIN32", создана пользователем ichthyander, 4 июл 2006.

  1. ichthyander

    ichthyander New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2006
    Сообщения:
    3
    Столкнулся с проблемой... при CommonDialog::ShowDialog() происходит сабклассинг овнера... причем при закрытии коммонДиалога .NET2.0 не вернул предыдущий WNDPROC...
    Выходит если я до вызова CommonDialog::ShowDialog() обрабатывал мессаги в своей WNDPROC, то после они станут обрабатываться стандартной процеДурой...

    Хотел решить эту проблему при помощи APIHooking'а... получилось... :) но не в .NET... :dntknw:
    в .NET пока положительных результатов не добился...

    может кто сталкивался с такой проблемой... и как хукать API в .NET которые были импортированы при помощи [DllImport...]

    заранее благодарю...
     
  2. OldDino

    OldDino New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    44
    Ты бы написал, в чём проблема, может быть, удалось бы эту проблему без мучений решить...

    С уважением.
     
  3. ichthyander

    ichthyander New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2006
    Сообщения:
    3
    Проблема в том, как вовремя узнать, что товарисчи из MS сабклассили окно... причем сделать это нужно из НЕ .NET DLL...

    Вот, примерно, что происходит в .Net классе CommonDialog:

    Subclass(owner); //Achtung!
    CreateCommonDialog(); // название придумал сам... но сути не меняет... :)
    ...
    DestroyCommonDialog();
    Unsubclass(); //Achtung! Тут они в SetWindowLong передают не предыдущую процедуру, а DefWindowProc...
    ...

    Хотел поймать SetWindowLong… но в .net не получилось... :dntknw:
     
  4. OldDino

    OldDino New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    44
    У класса CommonDialog dctuj-то навсего 8 методов, не считая статического конструктора и обычного конструктора. Судя по всему, речь идёт о методе ShowDialog, верно? Оно?

    public DialogResult ShowDialog(IWin32Window owner)
    {
    IntSecurity.SafeSubWindows.Demand();
    if (!SystemInformation.UserInteractive)
    {
    throw new InvalidOperationException(SR.GetString("CantShowModalOnNonInteractive"));
    }
    if (CommonDialog.helpMsg == 0)
    {
    CommonDialog.helpMsg = SafeNativeMethods.RegisterWindowMessage("commdlg_help");
    }
    DialogResult result1 = DialogResult.Cancel;
    this.ownerSubClass = new CommonDialog.OwnerSublass(this);
    this.ownerSubClass.Init(owner);
    using (CommonDialog.OwnerSublass sublass1 = this.ownerSubClass)
    {
    Application.BeginModalMessageLoop();
    try
    {
    return (this.RunDialog(this.ownerSubClass.Handle) ? DialogResult.OK : DialogResult.Cancel);
    }
    finally
    {
    Application.EndModalMessageLoop();
    }
    }
    return result1;
    }
     
  5. ichthyander

    ichthyander New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2006
    Сообщения:
    3
    ага.. оно самое...
    в .net 1.x все также только нет сабкласса... причем, зачем он появился MS похоже сами не знают пока... :)