Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы про .NET

Автор: Iceman82
Дата сообщения: 22.03.2006 17:11

Цитата:
Малчык хочет нахулиганить где-нибудь из под юзерского аккаунта


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

Ну да не об этом речь. Так вот кусок кода, который просто ничего не делает (вернее, в результате ничего не происходит)

Public Declare Function ExitWindowsEx Lib "user32" _
(ByVal uFlags As Long, ByVal dwReserved As Long) As Long

Public Declare Function GetLastError Lib "kernel32" () As Long

Private Structure LUID
Public LowPart As Long
Public HighPart As Long
End Structure

Private Structure TOKEN_PRIVILEGES
Public PrivilegeCount As Long
Public TheLuid As LUID
Public Attributes As Long
End Structure

Private Declare Function GetCurrentProcess Lib "kernel32" () As Long

Private Declare Function OpenProcessToken Lib "advapi32" _
(ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, _
ByRef TokenHandle As Long) As Long

Private Declare Function LookupPrivilegeValue Lib "advapi32" _
Alias "LookupPrivilegeValueA" _
(ByVal lpSystemName As String, ByVal lpName As String, _
ByRef lpLuid As LUID) As Long

Private Declare Function AdjustTokenPrivileges Lib "advapi32" _
(ByRef TokenHandle As Long, ByVal DisableAllPrivileges As Boolean, _
ByRef NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, _
ByRef PreviousState As TOKEN_PRIVILEGES, ByRef ReturnLength As Long) As Long

Public Sub AdjustToken()
Const TOKEN_ADJUST_PRIVILEGES = &H20
Const TOKEN_QUERY = &H8
Const SE_PRIVILEGE_ENABLED = &H2
Dim hdlProcessHandle As Long
Dim hdlTokenHandle As Long
Dim tmpLuid As LUID
Dim tkp As TOKEN_PRIVILEGES
Dim tkpNewButIgnored As TOKEN_PRIVILEGES
Dim lBufferNeeded As Long
Dim err_code As Long

hdlProcessHandle = GetCurrentProcess()
OpenProcessToken(hdlProcessHandle, (TOKEN_ADJUST_PRIVILEGES Or _
TOKEN_QUERY), hdlTokenHandle)

' Get the LUID for shutdown privilege.
tmpLuid = New LUID
LookupPrivilegeValue("", "SeShutdownPrivilege", tmpLuid)
err_code = GetLastError()

tkp.PrivilegeCount = 1 ' One privilege to set
tkp.TheLuid = tmpLuid
tkp.Attributes = SE_PRIVILEGE_ENABLED

' Enable the shutdown privilege in the access token of this process.
AdjustTokenPrivileges(hdlTokenHandle, False, _
tkp, Len(tkpNewButIgnored), tkpNewButIgnored, lBufferNeeded)
err_code = GetLastError()
End Sub

и по нажатию на кнопку такой код:

AdjustToken()
err_code = GetLastError()
err_code = ExitWindowsEx(flgShutdown, &H80000000)


Всякие константы и проверки на ошибки я убрал. Факт в том, что программа работает, не ругается, но ничего и не происходит...

Кстати, забыл сказать - LogOff работает замечательно, т.е. если ExitWindowsEx вызвать с параметром flgLogOff, то все замечательно - сеанс текущего пользователя завершается... Но LogOff мне как раз и не нужен-то...
Автор: JohhDoe
Дата сообщения: 22.03.2006 22:49
Здесьесть пример на C#.
http://www.gotdotnet.ru/Downloads/Examples/21925.aspx
Если лень разбираться, то можно использовать готовую дллку (там же лежит).
Если хочется именно на вб, то эту дллку можно посмотреть рефлектором.


+
http://rsdn.ru/Forum/Message.aspx?mid=605794&only=1

Может быть дело в
Private Structure LUID
Public LowPart As Long
Public HighPart As Long
End Structure

где Long - 8 байт
хотя

typedef struct _LUID {
DWORD LowPart;
LONG HighPart;
} LUID, *PLUID;
Автор: dmka
Дата сообщения: 24.03.2006 20:42
Iceman82

Цитата:
Малчык хочет по расписанию выключить свой компьютер, и для этого он не хочет использовать всякие глючные программулины с кучей всякой ненужной лабуды.

и с каких это пор системные утилиты стали "глючными программулинами", а хрень вызывающая winapi из vb.net правильной?

at hh:mm shutdown -f -s -t 1
Автор: Iceman82
Дата сообщения: 25.03.2006 00:32
dmka
Мне не совсем понятна суть возмущения:

Цитата:
и с каких это пор системные утилиты стали "глючными программулинами", а хрень вызывающая winapi из vb.net правильной?
at hh:mm shutdown -f -s -t 1


Во-первых, я и не говорил про системные утилиты, я упомянул именно "программулины" - есть небольшая разница, IMHO... И мне нужна именно моя программа, а не сис.утилиты.

Во-вторых, я и не говорил, что использование WinAPI в VB.Net'е - это правильная "хрень" - моя
Цитата:
Или необходимо играться напрямую с API-функциями (очень не хотелось бы этим заниматься в Visual Basic'е )


В-третих, ваша
Цитата:
если мосье извращенец, вызвать внешнюю утилиту, например shutdown -s -f

Автор: dmka
Дата сообщения: 25.03.2006 13:29
Iceman82

Цитата:
Мне не совсем понятна суть возмущения

ладно, проехали...

Цитата:
Кстати, забыл сказать - LogOff работает замечательно

BOOL ExitWindowsEx(UINT uFlags, DWORD dwReason);

Скорее всего ты напутал с типом передаваемых параметров, EWX_LOGOFF это 0, потому и работает.
Автор: Iceman82
Дата сообщения: 07.04.2006 00:07
А еще вот такой вопрос:
Может ли мне кто-нибудь точно сказать, поддерживает ли VB.NET перегрузку операторов в классах?
Потому как примеры в MSDN'е по перегрузке операторов приводятся только для C#, а про VB.NET ничего конкретного не сказано.
ЗЫ: И если можно, дайте ссылку на источник информации, плз
Автор: Iceman82
Дата сообщения: 17.04.2006 20:47
Еще одна проблема возникла:
При написание собственного UserControl'a все проходит нормально, до тех пор, пока я не пытаюсь создать производный элемент управления. Если делать все через "Проект->Добавить производный элемент управления", то после выбора компонента-родителя выскакивает окно с сообщением

Цитата:
Could not locate the project item templates for inherited components.

Пытаюсь написать код для производного компонента "вручную". Добавляю просто новый компонент, и его родителем ставлю уже существующий:

Цитата:
Public Class ctlAlarmClock Inherits ctlClockLib.ctlClock

После этого в окне редактирования графического вида контрола пропадает его формочка и появляется сообщение об ошибке следующего содержания:

Цитата:

The designer could not be shown for this file because none of the classes within it can be designed. The designer inspected the following classes in the file:

    ctlAlarmClock --- The base class ctlClockLib.ctlClock' could not be loaded. Ensure the assembly has been referenced or built if it is part of the project.

Насколько я понимаю, не хватает какой-то ссылки или файла. Что можно сделать?
Автор: Iceman82
Дата сообщения: 21.04.2006 22:24
Iceman82

Цитата:
Может ли мне кто-нибудь точно сказать, поддерживает ли VB.NET перегрузку операторов в классах?


Ладно, сам спросил, сам себе и отвечу.
Дело в том, что поддержка перегрузки операторов в классах появилась только в Visual Studio 2005. Проблема была в том, что в настоящий момент я использую версию 2003 года... Источник информации - http://www.vbstreets.ru/Articles/66077.aspx и вот здесь http://www.rsdn.ru/article/vb/vbnet.xml
Автор: Codegen
Дата сообщения: 17.02.2007 19:11
Ни как не получается создать окно в стиле ToolWindow, язык C#, Visual Studio 2005

Вот так можно создать обычное окно, но как поменять его стиль? В настройках формы нет такого свойста.


Код: using System;
using System.Windows.Forms;

namespace CustomToolCSharp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
}
Автор: GastonR
Дата сообщения: 17.02.2007 21:23
Codegen

Цитата:
Вот так можно создать обычное окно, но как поменять его стиль? В настройках формы нет такого свойста...

В конструкторе добавить следующую строчку:

Цитата:
this.FormBorderStyle = FormBorderStyle.FixedToolWindow;


Автор: MoKC0DeR
Дата сообщения: 28.04.2007 21:56
Есть библиотека (оформлена как dll) .NET. Как воспользоватся классами/объектами из этой библиотеки (язык не принципиален)
Автор: EZH
Дата сообщения: 29.04.2007 00:09
MoKC0DeR
В своем проекте добавить ссылку на dll (Add reference в Visual Studio) и вперед. Либо задействуя полное имя с namespace класса, либо просто using namespase (C#).
Автор: MoKC0DeR
Дата сообщения: 30.04.2007 21:41
EZH
спасибо все получилось.
Автор: chs52ncm
Дата сообщения: 01.06.2007 17:45
C#2.0
Нужно сделать дерово сети:
начинается с корня и ветвится на компьютеры, которые ветвятся на папки, которые ветвятся на файлы и папки и т.д.

Звучит плохо, т.к. это будет долгий процесс даже для средней по размеру сети. Так что просто нужны деревья отдельных компьютеров.

Список компьютеров в сети получается с помощью класса NetworkBrowser(Sacha Barber), к-рый можно найти здесь: http://www.codeproject.com/cs/internet/ListNetworkComputers.asp

Файлы в сети можно открывать обычными IO функциями, прописав к ним путь, похожий на этот: \\Computer1\Dir1\File1.ext

Есть собственная функция, пишущая дерово папки в XML-файл - принимает два параметра: путь к папке, путь к создаваемому XML-файлу.
Думаю, ей можно будет передать сетевой путь типа(\\Computer1\Dir1). Хотя не знаю. Времени нет запускать виртуальные машины и проверять скомпилированный в Visual Studio модуль.
Так как сделать список шареных папок типа вот этого?
Comp1->(Dir1,Dir2)
==================
     Dir1->SubDir1...
     /
Comp1    \
     Dir2->Subdir1...
==================

Помогите кто может!

Автор: grek99
Дата сообщения: 13.12.2007 22:50
В ответ на определенное действие рисую в форме, но если форму свернуть, а затем развернуть, или же если перекрыть форму другим окном, то рисунок исчезает. Как сделать чтобы рисунок не исчезал?
кто нить может помочь??
Автор: EZH
Дата сообщения: 14.12.2007 13:51
grek99
Это нормальное поведение. Тебе просто нужно организовать отрисовку в событии OnPaint формы, чтобы все отрисовывалось заново каждый раз, когда это потребует Windows. Заключи эту отрисовку в OnPaint по условию проверки некого флага, и выставляй этот флаг в нужном тебе действии.
Автор: grek99
Дата сообщения: 14.12.2007 21:27
EZH
Спасибо, все работает))

Страницы: 123

Предыдущая тема: Как с конвертировать в Delphi?


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.