Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> NativeMethods, как получить доступ к этому классу 
:(
    Опции темы
Plamenk
Дата 25.10.2004, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 258
Регистрация: 18.2.2003

Репутация: 1
Всего: 3



Все Привет!

Нашел в интернете довольно интересный пример кода (для создания элемента управления).
А интересен он тем, что автор вызывает в нём методы из класса NativeMethods. Тогда как у меня на компьютере данный класс является защищенным (т.е. в библиотеке он есть но вызвать его нельзя).

Отсюда вопрос каким образом можно вызвать методы из класса NativeMethods? (Если конечно вообще можно).

Пример кода: ( здесь находится оригинал)
Код
private void DrawFlatNCBorder(ref Message msg)

         {

              IntPtr hRgn1 = (IntPtr) msg.WParam;

              // The update region is clipped to the window frame. When wParam is 1, the entire window frame needs to be updated.



              IntPtr hdc = NativeMethods.GetDCEx(msg.HWnd, hRgn1, 1/*DCX_WINDOW*/|0x0020/*DCX_PARENTCLIP*/);

              if (hdc != IntPtr.Zero)

              {

                   using (Graphics g = Graphics.FromHdc(hdc))

                   {



                        Rectangle bounds = new Rectangle(0,0,this.Width,this.Height);

               

                        ControlPaint.DrawBorder(g,bounds,this.borderColor,ButtonBorderStyle.Solid);



                        // create a clipping region for remaining parts to be drawn excluding

                        // the border we did just drew

                        bounds.Inflate(-1, -1);

                        IntPtr hRgn2 = NativeMethods.CreateRectRgn(bounds.Left, bounds.Top, bounds.Right, bounds.Bottom);



                        if(hRgn2 == (IntPtr)1)

                        {

                             // Provide a new clipping region.

                             msg.WParam = (IntPtr) hRgn2;

                        }

                        else

                        {

                             // combine with existing clipping region.

                             NativeMethods.CombineRgn(hRgn1, hRgn1, hRgn2, NativeMethods.RGN_AND);

                             NativeMethods.DeleteObject(hRgn2);

                        }

                   }



                   msg.Result = (IntPtr) 1;

                   NativeMethods.ReleaseDC(msg.HWnd, hdc);

         

              }                

              Invalidate();

         }



PM MAIL   Вверх
sergejzr
Дата 25.10.2004, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



Может унаследоваться от него?


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Mad
Дата 25.10.2004, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 1
Всего: 19



Plamenk
А какой namespace ? (а то единственное упоминание в MSDN, это в примерах, и то они его там сами определяют :hmmm )


--------------------
user posted image
PM MAIL   Вверх
Plamenk
Дата 25.10.2004, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 258
Регистрация: 18.2.2003

Репутация: 1
Всего: 3



System.Windows.Forms.dll
PM MAIL   Вверх
Mad
Дата 25.10.2004, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 1
Всего: 19



Цитата(Plamenk @ 25.10.2004, 16:29)

System.Windows.Forms.dll

Это не namespace, а непосредственно библиотека :)
Какая версия SDK?



--------------------
user posted image
PM MAIL   Вверх
Plamenk
Дата 25.10.2004, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 258
Регистрация: 18.2.2003

Репутация: 1
Всего: 3



Mad

namespace соответсвенно System.Windows.Forms.

Версия NET 1.4.X.X - по-моему.

Вообще, этот класс не видно ни в одном namespace.

Это сообщение отредактировал(а) Plamenk - 25.10.2004, 17:01
PM MAIL   Вверх
Mad
Дата 25.10.2004, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 1
Всего: 19



Цитата(Plamenk @ 25.10.2004, 16:53)

namespace соответсвенно System.Windows.Forms.

Вообщето не обязательно ;-)


Цитата(Plamenk @ 25.10.2004, 16:53)

Версия NET 1.4.X.X - по-моему.

Или я слишком давно на download.microsoft.com не заходил (где-то месяц), или пока что тока .NET 1.1 есть :)
Добавлено @ 17:05
Цитата(Plamenk @ 25.10.2004, 16:53)

Вообще, этот класс не видно ни в одном namespace.

Тогда посмотри полный код примера (и описание тоже)
Скорей всего они его гдето выше определяют, делая экспорты из системных DLL.


--------------------
user posted image
PM MAIL   Вверх
Plamenk
Дата 25.10.2004, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 258
Регистрация: 18.2.2003

Репутация: 1
Всего: 3



2 Mad

С версией Net наверное правдо ошибся скорее всего 1.1.4.X.

Цитата
Тогда посмотри полный код примера (и описание тоже)
Скорей всего они его гдето выше определяют, делая экспорты из системных DLL.


Если не затруднит посмотри сам, может быть ты что-нибудь поймешь http://www.syncfusion.com/FAQ/WinForms/FAQ_c41c.asp#q1027q.
PM MAIL   Вверх
Vaulter
Дата 26.10.2004, 07:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1724
Регистрация: 30.12.2002
Где: бункер

Репутация: 3
Всего: 22



вот к чему привело небольшое расследование на 10 минут.
в начале я порыл доки и нашел такой код:
Код
protected override CreateParams CreateParams
{
    get {
             CreateParams cp = base.CreateParams;
             cp.ExStyle &= (~NativeMethods.WS_EX_CLIENTEDGE);
             cp.Style &= (~NativeMethods.WS_BORDER);

             switch (borderStyle) {
                 case BorderStyle.Fixed3D:
                     cp.ExStyle |= NativeMethods.WS_EX_CLIENTEDGE;
                     break;
                 case BorderStyle.FixedSingle:
                     cp.Style |= NativeMethods.WS_BORDER;
                     break;
             }
             return cp;
        }
}

потом порыл еще и опять таки нашел:
Код
class NativeMethods
{
   // This is a call to unmanaged code. Executing this method requires
   // the UnmanagedCode security permission. Without this permission
   // an attempt to call this method will throw a SecurityException:
   [DllImport("msvcrt.dll")]
   public static extern int puts(string str);
   [SuppressUnmanagedCodeSecurityAttribute()]
   [DllImport("msvcrt.dll")]
   internal static extern int _flushall();
}

как видно из приведенных текстов в MS сами определяли класс NativeMethods какими либо методами и свойствами. вывод: это не системный класс, а определенный пользователем.
Поискав по той страничке все вхождения NativeMethods, можно увидеть что там вызываются функции, точь в точь API ;)
вывод: в твоем случае, NativeMethods определен как класс напичканный APIшными Importами.
а пошарив еще и по инету можно найти вот такой класс:
Код

//------------------------------------------------------------------------------
// <copyright file="NativeMethods.cs" company="Microsoft">
//    
//      Copyright (c) 2002 Microsoft Corporation.  All rights reserved.
//    
//      The use and distribution terms for this software are contained in the file
//      named license.txt, which can be found in the root of this distribution.
//      By using this software in any fashion, you are agreeing to be bound by the
//      terms of this license.
//    
//      You must not remove this notice, or any other, from this software.
//    
// </copyright>                                                                
//------------------------------------------------------------------------------

namespace Microsoft.Win32 {
   using System;
   using System.Text;
   using System.Threading;
   using System.Runtime.Remoting;
   using System.Runtime.InteropServices;
   using System.Diagnostics;
   using System.ComponentModel;

   // not public!
   internal sealed class NativeMethods {

       public static readonly IntPtr INVALID_HANDLE_VALUE = (IntPtr)(-1);

       public const int GENERIC_READ = unchecked(((int)0x80000000));
       public const int GENERIC_WRITE = (0x40000000);

       public const int FILE_SHARE_READ = 0x00000001;
       public const int FILE_SHARE_WRITE = 0x00000002;
       public const int FILE_SHARE_DELETE = 0x00000004;

       public const int CREATE_ALWAYS = 2;

       public const int FILE_ATTRIBUTE_NORMAL = 0x00000080;

       public const int STARTF_USESTDHANDLES = 0x00000100;

       public const int STD_INPUT_HANDLE = -10;
       public const int STD_OUTPUT_HANDLE = -11;
       public const int STD_ERROR_HANDLE = -12;

       public const int STILL_ACTIVE = 0x00000103;
       public const int SW_HIDE = 0;

       public const int WAIT_OBJECT_0    = 0x00000000;
       public const int WAIT_FAILED      = unchecked((int)0xFFFFFFFF);
       public const int WAIT_TIMEOUT     = 0x00000102;
       public const int WAIT_ABANDONED   = 0x00000080;
       public const int WAIT_ABANDONED_0 = WAIT_ABANDONED;


       [StructLayout(LayoutKind.Sequential)]
       public class SECURITY_ATTRIBUTES {
           public int nLength = Marshal.SizeOf(typeof(SECURITY_ATTRIBUTES));
           public IntPtr lpSecurityDescriptor = IntPtr.Zero;
           public bool bInheritHandle = false;
       }

       [StructLayout(LayoutKind.Sequential)]
       public class STARTUPINFO {
           public int cb;
           public IntPtr lpReserved = IntPtr.Zero;
           public IntPtr lpDesktop = IntPtr.Zero;
           public IntPtr lpTitle = IntPtr.Zero;
           public int dwX = 0;
           public int dwY = 0;
           public int dwXSize = 0;
           public int dwYSize = 0;
           public int dwXCountChars = 0;
           public int dwYCountChars = 0;
           public int dwFillAttribute = 0;
           public int dwFlags = 0;
           public short wShowWindow = 0;
           public short cbReserved2 = 0;
           public IntPtr lpReserved2 = IntPtr.Zero;
           public IntPtr hStdInput = IntPtr.Zero;
           public IntPtr hStdOutput = IntPtr.Zero;
           public IntPtr hStdError = IntPtr.Zero;
       }

       [StructLayout(LayoutKind.Sequential)]
       public class PROCESS_INFORMATION {
           public IntPtr   hProcess = IntPtr.Zero;
           public IntPtr   hThread = IntPtr.Zero;
           public int      dwProcessId = 0;
           public int      dwThreadId = 0;
       }

       [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
       public static extern bool GetExitCodeProcess(IntPtr processHandle, out int exitCode);
       [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
       public static extern bool GetProcessTimes(IntPtr handle, long[] creation, long[] exit, long[] kernel, long[] user);

       [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Ansi, SetLastError=true)]
       public static extern IntPtr GetStdHandle(int whichHandle);
       [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
       public static extern int GetConsoleCP();
       [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
       public static extern int GetConsoleOutputCP();

       [DllImport(ExternDll.Kernel32, ExactSpelling=true, SetLastError=true)]
       public static extern int WaitForSingleObject(IntPtr handle, int timeout);

       [StructLayout(LayoutKind.Sequential)]
       public class SecurityAttributes {
           public int nLength = Marshal.SizeOf(typeof(SecurityAttributes));
           public IntPtr lpSecurityDescriptor;
           public bool bInheritHandle;
       }

       [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
       public static extern bool CreatePipe(out IntPtr hReadPipe, out IntPtr hWritePipe, SecurityAttributes lpPipeAttributes, int nSize);
       public static void IntCreatePipe(out IntPtr hReadPipe, out IntPtr hWritePipe, SecurityAttributes lpPipeAttributes, int nSize) {
           bool ret = CreatePipe(out hReadPipe, out hWritePipe, lpPipeAttributes, nSize);
           if (!ret || hReadPipe == INVALID_HANDLE_VALUE || hWritePipe == INVALID_HANDLE_VALUE)
               throw new Win32Exception();
       }

       [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]
       public class CreateProcessStartupInfo
       {
           public int cb = Marshal.SizeOf(typeof(CreateProcessStartupInfo));
           public string lpReserved = null;
           public string lpDesktop = null;
           public string lpTitle = null;
           public int dwX = 0;
           public int dwY = 0;
           public int dwXSize = 0;
           public int dwYSize = 0;
           public int dwXCountChars = 0;
           public int dwYCountChars = 0;
           public int dwFillAttribute = 0;
           public int dwFlags = 0;
           public short wShowWindow = 0;
           public short cbReserved2 = 0;
           public IntPtr lpReserved2 = (IntPtr)0;
           public IntPtr hStdInput = (IntPtr)0;
           public IntPtr hStdOutput = (IntPtr)0;
           public IntPtr hStdError = (IntPtr)0;
       }

       [StructLayout(LayoutKind.Sequential)]
       public class CreateProcessProcessInformation
       {
           public IntPtr hProcess = (IntPtr)0;
           public IntPtr hThread = (IntPtr)0;
           public int dwProcessId = 0;
           public int dwThreadId = 0;
       }

       [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
       public static extern bool CreateProcess(
           string lpApplicationName,                   // LPCTSTR
           [In] StringBuilder lpCommandLine,           // LPTSTR - note: CreateProcess might insert a null somewhere in this string
           SecurityAttributes lpProcessAttributes,     // LPSECURITY_ATTRIBUTES
           SecurityAttributes lpThreadAttributes,      // LPSECURITY_ATTRIBUTES
           bool bInheritHandles,                       // BOOL
           int dwCreationFlags,                        // DWORD
           IntPtr lpEnvironment,                       // LPVOID
           string lpCurrentDirectory,                  // LPCTSTR
           CreateProcessStartupInfo lpStartupInfo,                 // LPSTARTUPINFO
           CreateProcessProcessInformation lpProcessInformation    // LPPROCESS_INFORMATION
           );

       [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
       public static extern bool TerminateProcess(IntPtr processHandle, int exitCode);

       [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto)]
       public static extern int GetCurrentProcessId();
       [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Ansi, SetLastError=true)]
       public static extern IntPtr GetCurrentProcess();
       
             
   }
}



--------------------
PM MAIL WWW ICQ   Вверх
Plamenk
Дата 26.10.2004, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 258
Регистрация: 18.2.2003

Репутация: 1
Всего: 3



2 Vaulter:

Спасибо за исчерпывающий ответ!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0940 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.