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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CA1060 : Так как метод является методом P/Invoke, vb net  
V
    Опции темы
vladd
Дата 6.3.2012, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



VB Net 2010
Обьявил функцию
Код

Private Declare Function DestroyWindow Lib "user32" (ByVal hWnd As Int32) As Int32


Выскакивает предупреждение
CA1060 : Так как метод является методом P/Invoke, должен быть определен в классе с именем NativeMethods, SafeNativeMethods или UnsafeNativeMethods.
Смотрю в msdn
CA1060: переместите P/Invokes в класс NativeMethods
Смотрю пример

В следующем примере показан метод Interaction.Beep, создающий оболочку для функции MessageBeep из библиотеки user32.dll.P/Invoke MessageBeep находится внутри класса NativeMethods.
Код

Imports System    
Imports System.Runtime.InteropServices    
Imports System.ComponentModel         

Public NotInheritable Class Interaction  

    Private Sub New()        
    End Sub                

    ' Callers require Unmanaged permission        
    Public Shared Sub Beep()                        
        ' No need to demand a permission as callers of Interaction.Beep                     
        ' will require UnmanagedCode permission                     
        If Not NativeMethods.MessageBeep(-1) Then                
            Throw New Win32Exception()            
        End If

    End Sub  

End Class         

Friend NotInheritable Class NativeMethods  

    Private Sub New()        
    End Sub             

    <DllImport("user32.dll", CharSet:=CharSet.Auto)> _        
    Friend Shared Function MessageBeep(ByVal uType As Integer) As <MarshalAs(UnmanagedType.Bool)> Boolean        
    End Function  

End Class



Ничего не понял. Попробывал по разному. Ничего не получилось.  Как правильно переместить DestroyWindow в класс NativeMethods? 
PM MAIL   Вверх
diadiavova
Дата 6.3.2012, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Цитата(vladd @  6.3.2012,  17:14 Найти цитируемый пост)
.  Как правильно переместить DestroyWindow в класс NativeMethods?  

В смысле? Объяснить как разместить метод внутри класса что ли? smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
vladd
Дата 7.3.2012, 07:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Да. Как мне правильно обьявить Function DestroyWindow чтобы не было этого предупреждения и других тоже. 

Это сообщение отредактировал(а) vladd - 7.3.2012, 07:17
PM MAIL   Вверх
diadiavova
Дата 7.3.2012, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Цитата(vladd @  7.3.2012,  08:05 Найти цитируемый пост)
Да. Как мне правильно обьявить Function DestroyWindow чтобы не было этого предупреждения и других тоже. 

Что касается правильного объявления, то смотри здесь
http://www.pinvoke.net/default.aspx/user32.destroywindow
Ну, а если говорить о правильном местоположении, то ты ведь не показал в каком контексте она у тебя объявлена, я не очень понял смысл предупреждения, возможно ты объявил функцию вне класса или пытаешься вызвать из другого класса, не смотря на то, что она приватная.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
vladd
Дата 7.3.2012, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Обьявил так как написано было на сайте 
Код

<DllImport("user32.dll", CharSet:=CharSet.Unicode, SetLastError:=True)> _
    Private Shared Function DestroyWindow(ByVal hwnd As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
    End Function
 

Но все равно пишет 
Предупреждение    1    CA1060 : Microsoft.Design : Так как метод является методом P/Invoke, 'PlaceBets.DestroyWindow(IntPtr)' должен быть определен в классе с именем NativeMethods, SafeNativeMethods или UnsafeNativeMethods.    

А обьявляю я его в модуле своего User control PlaceBets
Это полный код модуля где я обьявляю DestroyWindow
Код

Imports System
Imports System.Runtime.InteropServices
Imports System.ComponentModel

Public Class PlaceBets
    <DllImport("user32.dll", CharSet:=CharSet.Unicode, SetLastError:=True)> _
    Private Shared Function DestroyWindow(ByVal hwnd As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
    End Function
    'Private Declare Function DestroyWindow Lib "user32" (ByVal hWnd As Int32) As Int32

    Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim lgHwnd As Integer = Val(Me.Button1.Text)
        RemovePlaceBets(lgHwnd)
    End Sub

    Public Sub RemovePlaceBets(ByVal lngHwnd As Integer)
        Dim PlaceBets1 As New PlaceBets
        Dim i As Integer = TestForm.tabGlavMarckets.SelectedIndex
        Dim j As Integer
        Dim c As Control
        If lngHwnd <> 0 Then
            DestroyWindow(lngHwnd)
            Name = TestForm.tabGlavMarckets.TabPages(i).Name
            If TestForm.tabPage.Contains(Name) Then
                For Each c In TestForm.tabPage(Name)
                    j = j + 1
                    If TypeOf c Is PlaceBets Then
                        TestForm.tabPage(Name).Remove(j)
                        Exit For
                    End If
                Next
            End If
            Call TestForm.ClearColumnAllGreen()
            TestForm.AvtoPoiskOn()
            TestForm.WebBrowser1.Navigate("about:<b></b>")
        End If
    End Sub

    'Price value increments --------------------------------------------------------------
    Private OddsLim() As Decimal = {2, 3, 4, 6, 10, 20, 30, 50, 100}   'Odd range limits
    Private OddsInc() As Decimal = {0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10} 'Odds increments

    Private Sub nudPrice_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles nudPrice.ValueChanged
        Dim i As Integer, v As Decimal
        Static Vprev As Decimal   'Previous value
        With nudPrice
            v = .Value
            For i = 0 To UBound(OddsLim)  'Determine price range
                If v <= OddsLim(i) Then Exit For
            Next i
            Select Case Vprev   'Adjustments required for smooth incrementing
                Case 3
                    If v = 3.02 Then v = 3.025
                Case 10
                    If v = 10.2 Then v = 10.25
                Case 50
                    If v = 52 Then v = 52.5
            End Select
            .Value = Decimal.Round(v / OddsInc(i), MidpointRounding.AwayFromZero) * OddsInc(i) 'Round to the nearest valid price
            .Increment = OddsInc(i)  'Set the increment
        End With
        Vprev = v
    End Sub
End Class
Public Class Bets
    Public Property Id As Long
    Public Property Time As String
    Public Property Selection As String
    Public Property Size As Double
    Public Property Odd As Double
    Public Property Status As String
    Public Property Tipe As String
End Class



PM MAIL   Вверх
diadiavova
Дата 11.3.2012, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



vladd, я не в курсе, что это за ошибка и у тебя тут все равно кое что непонятно. Непонятно, что за классы в предупреждении, назначение некоторых переменных и откуда они берутся. Я сделал пример, где эта функция работает( в аттаче). А вообще, для уничтожения окна есть метод Dispose, так что мне в принципе непонятно, для чего дергать винапи.

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  destrwin.rar 61,75 Kb


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
vladd
Дата 11.3.2012, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо за ответ. Твой пример запустил, работает. Но когда сделал анализ кода то же предупреждение
Предупреждение    1    CA1060 : Microsoft.Design : Так как метод является методом P/Invoke, 'Form1.DestroyWindow(IntPtr)' должен быть определен в классе с именем NativeMethods, SafeNativeMethods или UnsafeNativeMethods.    D:\6 Програмирование\VB  Net\destrwin\destrwin\Form1.vb    5    destrwin
 Я просто взял это из VB6, т.к. раньше писал немного на нем, для удаления контрола создаваемого динамически. А как применить метод Dispose
попроще не знаю для удаления контролов создаваемых динамически. Это надо создавать коллекцию, затем как то искать тот контрол на котором кнопка для удаления этого контрола. А как указать этой кнопке именно этот котрол? Вообщем для меня то темный лес. А так я указал hwnd контрола в тексте кнопки при его создании, и при нажатии считываю его, и запускаю DestroyWindow. Только как убрать это предупреждение не знаю потому и спрашиваю у гуру, т.е. у Вас.

Это сообщение отредактировал(а) vladd - 11.3.2012, 18:47
PM MAIL   Вверх
diadiavova
Дата 12.3.2012, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Цитата(vladd @  11.3.2012,  19:28 Найти цитируемый пост)
Но когда сделал анализ кода то же предупреждение

И что? Оно просто подсказывает как оптимизировать код, то есть привести в соответствие с определенным стилем. Можно переписать код вот так
Код

Imports System.Runtime.InteropServices

Public Class Form1


    Dim win As Form

    Private Sub btnCreateWindow_Click(sender As System.Object, e As System.EventArgs) Handles btnCreateWindow.Click
        If win IsNot Nothing Then
            win.Dispose()
        End If
        win = New Form
        win.Show()
    End Sub

    Private Sub btnDestroyWindow_Click(sender As System.Object, e As System.EventArgs) Handles btnDestroyWindow.Click
        If win IsNot Nothing Then
            NativeMethods.DestroyWindow(win.Handle)
        End If
    End Sub

    Private Sub Form1_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
        If win IsNot Nothing Then
            win.Dispose()
        End If
    End Sub
End Class


Class NativeMethods
    <DllImport("user32.dll", CharSet:=CharSet.Unicode, SetLastError:=True)> _
    Friend Shared Function DestroyWindow(ByVal hwnd As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
    End Function
End Class
Тогда этого предупреждения не будет. Можно настроить правила, по которым будут выдаваться предупреждения. Но вообще, предупреждения - это не ошибки и с ними код вполне может работать. Просто в данном случае анализатор кода уведомляет тебя, что код не соответствует правилам, рекомендованным майкрософт, только и всего.

Добавлено через 38 секунд
Цитата(vladd @  11.3.2012,  19:28 Найти цитируемый пост)
А как применить метод Dispose

У всех контролов есть этот метод, его просто надо вызвать.

Добавлено через 2 минуты и 41 секунду
Цитата(vladd @  11.3.2012,  19:28 Найти цитируемый пост)
А как указать этой кнопке именно этот котрол?

Зависит от того, по какому принципу ты ее ищешь.
Цитата(vladd @  11.3.2012,  19:28 Найти цитируемый пост)
А так я указал hwnd контрола в тексте кнопки при его создании

ну есть вообще-то свойство Handle, я его использовал.

Добавлено через 3 минуты и 22 секунды
Кстати, метод Dispose я вызывал в своем коде для формы, точно так же это делается для любого контрола.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
vladd
Дата 12.3.2012, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Еще раз спасибо. Но все равно пишет Предупреждение    1    CA1060 : Microsoft.Design : Так как метод является методом P/Invoke, 'Form1.DestroyWindow(IntPtr)' должен быть определен в классе с именем NativeMethods, SafeNativeMethods или UnsafeNativeMethods.    D:\6 Програмирование\VB  Net\destrwin\destrwin\Form1.vb    5    destrwin

PM MAIL   Вверх
diadiavova
Дата 12.3.2012, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Цитата(vladd @  12.3.2012,  13:54 Найти цитируемый пост)
Но все равно пишет Предупреждение

Замени код из аттача на то, что я оставил в предыдущем посте. Я проверял, ничего не пишет. Можно так же отключить предупреждения или конкретно это предупреждение.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
vladd
Дата 12.3.2012, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А ты где проверял? Я проверяю VS 2010 меню Анализ/Запустить анализ кода на destrwin.user posted image  
PM MAIL   Вверх
diadiavova
Дата 12.3.2012, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Цитата(vladd @  12.3.2012,  15:26 Найти цитируемый пост)
А ты где проверял? Я проверяю VS 2010 меню Анализ/Запустить анализ кода на destrwin.

Вообще-то я написал, что предупреждение исчезает в исправленной версии кода, а у тебя тут первоначальная.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
vladd
Дата 12.3.2012, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Извини это я оставил старое обьявление функции DestroyWindow, а надо было его удалить и по новому обьявить в Class NativeMethods. И большое спасибо. Все этого  предупреждения больше нет. Этот вопрос закрыт.
PM MAIL   Вверх
diadiavova
Дата 13.3.2012, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Еще пара замечаний:
В настройках анализа кода можно отменить те предупреждения, которым не хочешь следовать, эти рекомендации выполнять не обязательно и у тебя могут быть свои правила.

Ну и оператор Declare все еще поддерживается, а использование атрибута DllImport - альтернативный вариант записи(по крайней мере применительно к бейсику, вообще компилятор создает этот атрибут в обоих случаях).


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

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

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


 




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


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

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