Начинай с несложного языка и ты будешь не способен выучить что-то посложнее и лучше. Аргументов целое множество. Главный -- почти все современные, популярные, востребованные языке базируются на синтаксисе С 1985 года.
Не согласен, ибо глупости говоришь. PBPROG, лучше уж не PureBasic, а visual basic 6.0
Сообщение отредактировал fireday - Пятница, 18 Января 2013, 05:35
Скажу сразу - все не читал. Я так понял автору нужен мозаичный редактор карт 2д. Я надеюсь ты спрайтами пользуешься? Допустим у тебя есть пикчер бокс, в него и будем рисовать. Создаем карту например 10*10, того массив из 100 спрайтов. А в пикчер бокс видно только 5*5, по этому нужна возможность таскания. Создаем главный спрайт, который будем рисовать. Рисовать 1 спрайт быстрее чем кучу мелких, т.к. это графич. обновление изображения - требуется больше времени. По этому сначала рисуем наши маленькие спрайты в глв. спрайт, потом уже рисуем его. при маус давн на карте включаеш таймер, если маус ап срабатывает через Н милисек - это клик, если нет, то клика не делаем. Вот так можно заполнять карту. Допустим ты выбрал изображение, кликнул по нужному спрайту - заполнил ячейку. при маус давн "map_move"=true, при маус ап "map_move"=false. при маус мув если "map_move"=true, то дигаешь мапу, а именно прорисовываешь главный спрайт с нужными тебе изменениями left, top, определяя разницу в изменении координат мыши. То есть, при маус давн запоминаешь начальное положение глав. спрайта mdX=x,mdy=y, mdL=left, mdT=top Потом рисуешь его с изменениями. left=mdL+(x-mdX), top=mdT+(y-mdy)
Сообщение отредактировал fireday - Понедельник, 14 Января 2013, 00:14
Public Function SendMail(adresant As String, _ adresat As String, adresantpass As String, mailsubj As String, _ mailbody As String, smtpservak As String, Optional mailattach1 As String) Set iMsg = CreateObject("CDO.Message") Set iConf = CreateObject("CDO.Configuration") Set Flds = iConf.Fields Flds.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1 Flds.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = adresant Flds.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = adresantpass Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = smtpservak Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
Flds.Update iMsg.Configuration = iConf iMsg.To = adresat iMsg.From = adresant iMsg.Subject = mailsubj iMsg.TextBody = mailbody If mailattach1 <> "" Then iMsg.AddAttachment = mailattach1 End If iMsg.Send Set iMsg = Nothing Set iConf = Nothing Set Flds = Nothing End Function
Советую начать с простого. С++ нагружает программиста множеством аспектов, которые зачастую не нужны. Много ошибок в коде, которые сложно уловить, особенно для новичка.
Начните с простого языка, где простой синтаксис. По программируйте, поймете азы. Поймете что такое программирование. Вот тогда и сможете выбрать язык по вкусу "для себя". Это очень важно найти именно "свой" язык. Путь этот тернист, но он стоит того.
Мне, например, доставляют удовольствие возможности которые предоставляет вб (говоря только об офисе) Программировать прям в экселе, работать с эксель файлами из вб и т.д. Уметь такое для себя уже хорошо, а если и для работы пригодится - красота.
Если хочешь научиться программированию - советую начать с visual basic 6.0 (он разрабатывался специально для обучения) Потом, как освоишь азы, сможешь выбрать более современный язык. Уже осмысленно. п.с. А мне до сих пор лень переходить с вб6. На нем могу сделать почти все что хочу. Драйверы вот не напишешь(
Сообщение отредактировал fireday - Воскресенье, 06 Января 2013, 22:33
5 лет уже программирую. Начинал с паскаля, дельфи. Попробовал бейсик. На данный момент знаю бейсик и паскаль. И как вы думаете на чем я пишу? Начнем с паскаля - На нем сложно что-то нормальное написать. Когда 30 вложенных операторов и все они end;end; Траты времени на расставление бесполезный директив, которые были введены специально для обучения (напр. begin), утомляет. А человек ведь ленивое создание, воти идет по легкому пути, п этому я выбрал бейсик.
В общем, людей которых я знаю, которые знают дельфи и что-то еще пишут на чем то еще, но не на дельфи. На дельфи я знаю несколько удачных проектов, например l2phx, а написан он был только из-за того что к дельфи в интернете есть куча библиотек, а автор программы не смог реализовать нормальный инжект для перехвата трафика, вот и использовал сторонние библы, по этому эта программа написана на дельфи. Смог бы написать библу сам - не писал бы на дельфи.
п.с. Простите за столь исковерканное изложение мыслей, пишу уставшей... п.п.с. После того как попробовал бейсик (vb6) после паскаля - отношение к программированию изменилось. Я рад что попробовал бейсик.
Сообщение отредактировал fireday - Пятница, 14 Декабря 2012, 23:30
Вот тут можете создать темку, посоветуют. citilink По делу. Я бы взял атлон х4 740/750 на fm2. Самое выгодное предложение цена/производительность. По поводу видео, сейчас красные заправляют. Так что 7770/7850. Память советую сразу 8Гб.
Archido win 7 (32/64). UAC включен. А вообще, программа должна нормально отрабатывать на ОС начиная с XP. Думаю, что сделаю так Контролирующая софтина будет грузится только при старте. Проверила - выключилась. Если чего-то не хватает, она копирует и запускает. А уже сам клиент будет защищен bsod-ом.
При установке "RtlSetProcessIsCritical" ОС его откажется завершать, а при попытке завалить через отладку (SE_DEBUG_NAME) - будет BSOD. Снять можно точно также как и поставить.
По поводу снятия. Пожалуйста, можно по точнее.
Добавлено (02.12.2012, 22:57) --------------------------------------------- Делаю вот так: модуль:
Private Type LUID LowPart As Long HighPart As Long End Type Private Type LUID_AND_ATTRIBUTES pLuid As LUID Attributes As Long End Type Private Type TOKEN_PRIVILEGES PrivilegeCount As Long Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES End Type
Public Declare Function RtlSetProcessIsCritical Lib "ntdll.dll" (ByVal NewValue As Boolean, ByVal OldValue As Boolean, ByVal WinLogon As Boolean)
Private Declare Function AdjustTokenPrivileges Lib "advapi32.dll" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long Private Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLUID As LUID) As Long Private Declare Function GetCurrentProcess Lib "kernel32" () As Long Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
Public Const SE_CREATE_TOKEN_NAME As String = "SeCreateTokenPrivilege" Public Const SE_ASSIGNPRIMARYTOKEN_NAME As String = "SeAssignPrimaryTokenPrivilege" Public Const SE_LOCK_MEMORY_NAME As String = "SeLockMemoryPrivilege" Public Const SE_INCREASE_QUOTA_NAME As String = "SeIncreaseQuotaPrivilege" Public Const SE_UNSOLICITED_INPUT_NAME As String = "SeUnsolicitedInputPrivilege" Public Const SE_MACHINE_ACCOUNT_NAME As String = "SeMachineAccountPrivilege" Public Const SE_TCB_NAME As String = "SeTcbPrivilege" Public Const SE_SECURITY_NAME As String = "SeSecurityPrivilege" Public Const SE_TAKE_OWNERSHIP_NAME As String = "SeTakeOwnershipPrivilege" Public Const SE_LOAD_DRIVER_NAME As String = "SeLoadDriverPrivilege" Public Const SE_SYSTEM_PROFILE_NAME As String = "SeSystemProfilePrivilege" Public Const SE_SYSTEMTIME_NAME As String = "SeSystemtimePrivilege" Public Const SE_PROF_SINGLE_PROCESS_NAME As String = "SeProfileSingleProcessPrivilege" Public Const SE_INC_BASE_PRIORITY_NAME As String = "SeIncreaseBasePriorityPrivilege" Public Const SE_CREATE_PAGEFILE_NAME As String = "SeCreatePagefilePrivilege" Public Const SE_CREATE_PERMANENT_NAME As String = "SeCreatePermanentPrivilege" Public Const SE_BACKUP_NAME As String = "SeBackupPrivilege" Public Const SE_RESTORE_NAME As String = "SeRestorePrivilege" Public Const SE_SHUTDOWN_NAME As String = "SeShutdownPrivilege" Public Const SE_DEBUG_NAME As String = "SeDebugPrivilege" Public Const SE_AUDIT_NAME As String = "SeAuditPrivilege" Public Const SE_SYSTEM_ENVIRONMENT_NAME As String = "SeSystemEnvironmentPrivilege" Public Const SE_CHANGE_NOTIFY_NAME As String = "SeChangeNotifyPrivilege" Public Const SE_REMOTE_SHUTDOWN_NAME As String = "SeRemoteShutdownPrivilege"
Public Function ObtenerPrivilegios(ByVal privilegio As String) As Long Dim lpLUID As LUID Dim lpToken As TOKEN_PRIVILEGES Dim lpAntToken As TOKEN_PRIVILEGES Dim hToken As Long Dim hProcess As Long Dim res As Long
hProcess = GetCurrentProcess() res = OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, hToken) If res = 0 Then Exit Function End If res = LookupPrivilegeValue(vbNullString, privilegio, lpLUID) If res = 0 Then Exit Function End If With lpToken .PrivilegeCount = 1 .Privileges(0).Attributes = SE_PRIVILEGE_ENABLED .Privileges(0).pLuid = lpLUID End With
res = AdjustTokenPrivileges(hToken, False, lpToken, Len(lpToken), lpAntToken, Len(lpAntToken)) If res = 0 Then Exit Function End If ObtenerPrivilegios = res End Function
Вызываю вот так.
Code
Private Sub Form_Load() ObtenerPrivilegios SE_DEBUG_NAME RtlSetProcessIsCritical False, False, True End Sub
Добавлено (03.12.2012, 00:19) --------------------------------------------- Заметил вот что - защита работает, только если вызывать ObtenerPrivilegios SE_DEBUG_NAME в событии load (я так понимаю пока форма визуально не загрузилась). А вот снять защиту потом не получается. Снимаю так:
Для защиты процесса, можно сделать инжект в необходимый процесс и выполнить там небольшой код, вызвав одну недокументированную и интересную ф-цию из ntdll - "RtlSetProcessIsCritical". При попытке убить такой процесс - результатом будет BSOD
Надо сделать две dll-ки, первая делает процесс критическим. Вторая снимает защиту. Так работать будет?
Сообщение отредактировал fireday - Понедельник, 03 Декабря 2012, 00:22
Отбить желание у детишек пытаться делать плохие вещи , а так то, ессно, можно как хочешь сделать. При установке "RtlSetProcessIsCritical" ОС его откажется завершать, а при попытке завалить через отладку (SE_DEBUG_NAME) - будет BSOD. Снять можно точно также как и поставить.
А можно обойтись без BSOD? Т.е. просто заблокировать попытку закрытия/вызвать перезагрузку через 30 сек, как при закрытии некоторых сист. процессов (ее же нельзя отменить shutdown -a?)? Ведь по мимо "SE_DEBUG_NAME", есть еще куча подобных параметров. Вот только какой мне нужен не знаю.
Code
Public Const SE_CREATE_TOKEN_NAME As String = "SeCreateTokenPrivilege" Public Const SE_ASSIGNPRIMARYTOKEN_NAME As String = "SeAssignPrimaryTokenPrivilege" Public Const SE_LOCK_MEMORY_NAME As String = "SeLockMemoryPrivilege" Public Const SE_INCREASE_QUOTA_NAME As String = "SeIncreaseQuotaPrivilege" Public Const SE_UNSOLICITED_INPUT_NAME As String = "SeUnsolicitedInputPrivilege" Public Const SE_MACHINE_ACCOUNT_NAME As String = "SeMachineAccountPrivilege" Public Const SE_TCB_NAME As String = "SeTcbPrivilege" Public Const SE_SECURITY_NAME As String = "SeSecurityPrivilege" Public Const SE_TAKE_OWNERSHIP_NAME As String = "SeTakeOwnershipPrivilege" Public Const SE_LOAD_DRIVER_NAME As String = "SeLoadDriverPrivilege" Public Const SE_SYSTEM_PROFILE_NAME As String = "SeSystemProfilePrivilege" Public Const SE_SYSTEMTIME_NAME As String = "SeSystemtimePrivilege" Public Const SE_PROF_SINGLE_PROCESS_NAME As String = "SeProfileSingleProcessPrivilege" Public Const SE_INC_BASE_PRIORITY_NAME As String = "SeIncreaseBasePriorityPrivilege" Public Const SE_CREATE_PAGEFILE_NAME As String = "SeCreatePagefilePrivilege" Public Const SE_CREATE_PERMANENT_NAME As String = "SeCreatePermanentPrivilege" Public Const SE_BACKUP_NAME As String = "SeBackupPrivilege" Public Const SE_RESTORE_NAME As String = "SeRestorePrivilege" Public Const SE_SHUTDOWN_NAME As String = "SeShutdownPrivilege" Public Const SE_DEBUG_NAME As String = "SeDebugPrivilege" Public Const SE_AUDIT_NAME As String = "SeAuditPrivilege" Public Const SE_SYSTEM_ENVIRONMENT_NAME As String = "SeSystemEnvironmentPrivilege" Public Const SE_CHANGE_NOTIFY_NAME As String = "SeChangeNotifyPrivilege" Public Const SE_REMOTE_SHUTDOWN_NAME As String = "SeRemoteShutdownPrivilege"
Сообщение отредактировал fireday - Понедельник, 03 Декабря 2012, 00:10
Проще всего записать образ диска на USB-флешку, а USB в школьных компьютерах точно должны быть, хотя бы 1 свободный (или мышь/клавиатуру на время загрузки отключить)... Потом по-быстрому в BIOS настройки поменять или выбрать девайс из меню выбора устройства для бута...
Quote (TimKruz)
Загрузиться с LiveCD проще (скачал - записал - воткнул - выбрал устройство), чем искать способ убить заблокированную программу в системе без админ-прав. Способ всё равно остаётся, только это надо много чего знать и понимать, а загрузить какую-нибудь WinXP LiveCD и удалить файлик любой сможет. Так что единственный эффективный способ - визуальный контроль за учениками...
Вопрос так е решаем - загрузка только с hdd. Остальное отключается. Так же биос под пароль - не загрузится с флешки/диска. По поводу визуального контроля за учениками. А я говорил что надо обеспечить контроль так, что бы визуальный не требовался? Об этом речи не шло.
Quote (TimKruz)
В идеальной школе компьютерный класс должен закрываться на перемену и иметь хоть какую-то защиту, учителя должны контролировать своих учеников на протяжении всего урока, ну и т.д., и т.п.... На практике всем пофиг на всё и всех. Но и особо буйных школьников-хакеров не так уж много, максимум в игрушки сидят играют, или меняют обои/заставки на какую-нибудь прикольную фигню...
Как написал выше - я не говорил об визуальном контроле вообще. На счет такого что всем на всех пофиг - согласен.
Quote (TimKruz)
Ну тогда в "Общие обсуждения программистов". К C++ тут вообще никакого отношения нет. А люди тут (на подфоруме "Программирование") сидят одни и те же, потому что тем не так много...
Что же рука лицо сразу? Про продвинутость я сказал, так как обычно именно люди работающие на с++ имеют дела с подобными вещами. Да, тут действительно именно к с++ отношения нету.
Quote (TimKruz)
Совсем не нужно, достаточно поместить в папку C:/Program Files/ и запретить доступ всем, у кого права ниже админа, ко всем папкам кроме C:/Temp (где сохраняются программульки учеников и всё такое) и, если нужно - отдельного логического диска D. Исполнять программу из заблокированной на изменения папки будет по-прежнему можно, но удалить/изменить нельзя.
Да, это в порядке вещей, я так и сделаю, но все же я перестрахуюсь сделав файл скрытым и системным (привычка прятать).
Quote (TimKruz)
Unclocker прав админа требует, если не ошибаюсь.
Да, действительно требует. Я об этом думал - он там работает, однако что-то левое запустить - открывает окошко с запросом прав сетевого админа. Если поулчится прикрутить к своей программе Админские права - проблема решена.)
1) Никуда инжектиться не надо, просто запустить свой собственный процесс с правами админа и сделать его критическим 2) чтобы похукать NtClose нужен дров, это не твой вариант
2) не знал. 1) Думаю, что так и сделаю. Так же прикручу программку для проверки валидности. "запустить свой собственный процесс с правами админа и сделать его критическим " - Обойти такое без прав админа не получится?