Рассылка закрыта
При закрытии подписчики были переданы в рассылку "RFpro.ru: Ассемблер? Это просто! Учимся программировать" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
RusFAQ.ru: программирование на языке Assembler
Информационный Канал Subscribe.Ru |
RusFAQ.ru: программирование на языке Assembler
Выпуск № 592
от 16.07.2003, 12:00
Администратор: Имя: Калашников О.А. URL: Информационный ресурс ICQ: 68951340 Россия, Москва |
О рассылке: Задано вопросов: 3711 Отправлено ответов: 10905 Активность: 293.8 %
|
Список экспертов, ответы которых опубликованы в данном выпуске |
Евгений Иванов Статус: Доверительный Общий рейтинг: 137.11 [Подробней >>] |
Ayl Статус: Профессиональный Общий рейтинг: 118.28 [Подробней >>] |
_vt Статус: Профессиональный Общий рейтинг: 122.12 [Подробней >>] |
Теоретик Статус: Начальный Общий рейтинг: 119.35 [Подробней >>] |
Hangatyr Статус: Опытный Общий рейтинг: 114.26 [Подробней >>] |
Gibbel Статус: Профессиональный Общий рейтинг: 107.8 URL: Savage Metal Club - жизнь в стиле рок-н-ролл Телефон: +7 901 710 3146 [Подробней >>] |
Andy Статус: Доверительный Общий рейтинг: 109.82 [Подробней >>] |
Zedr0n Статус: Доверительный Общий рейтинг: 108.48 [Подробней >>] |
Bob Johnson Статус: Профессиональный Общий рейтинг: 152.11 URL: Программирование [Подробней >>] |
Broken Sword Статус: Профессиональный Общий рейтинг: 121.64 URL: мой сайт [Подробней >>] |
Дмитрий Статус: Профессиональный Общий рейтинг: 129.58 [Подробней >>] |
Tigran K. Kalaidjian Статус: Профессиональный Общий рейтинг: 121.5 URL: Методы оптимизации работы ПК [Подробней >>] |
St Статус: Профессиональный Общий рейтинг: 107.35 [Подробней >>] |
Краткий перечень вопросов |
Вопрос № 3680. Уважаемые эксперты , вопрос таков есть файл открытый на запись чтение , возможно ли его закрыть(сбро... (ответов: 4)
Вопрос № 3682. Доброй жизни, Эксперты! Я по поводу вчерашнего письма. Спасибо за вразумление. Хоть дошло, что за гл... (ответов: 2)
Вопрос № 3683. Добрый день ув.Эксперты! Есть файл (текстовый, doc) Как под Виндами запретить его копирование (если... (ответов: 4)
Вопрос № 3685. Пpивeт экcпepты! Тут тaкaя бaдягa - знaчит выделить динaмически кусок пaмяти - пaрa пустяков, - a... (ответов: 4)
Вопрос № 3686. Здравствуйте, уважаемые эксперты! Возможно, вопрос не совсем по теме, но если кто знает, подскажите:... (ответов: 5)
Вопрос № 3687. Это ответ на вот этот вопрос: Hi. Возможно ли из обработчика прерывания (допустим 9) вызвать процеду... (ответов: 1)
Вопрос № 3688. Добрый день уважаемые эксперты!!! Подскажите почему компилятор Tasm 5 выдаёт ошибки в строках "... (ответов: 7)
Вопросов: 7, ответов: 27
Вопрос № 3680 |
Уважаемые эксперты , вопрос таков есть файл открытый на запись чтение , возможно ли его закрыть(сбросить на диск),
не полностью а усечь на некое количество байт, т.е весь файл без хвостика(пример желательно на Ассемблере под DOS),
вариант с открытием нового файла, записи туда нужного куска, и последующего переименования не подходит
Вопрос отправлен: 11.07.2003, 07:03
Отправитель: greg
[Следующий вопрос >>] [Список вопросов]
Отвечает Евгений Иванов
Приветствую Вас, greg!
Устанавливаешь указатель на нужную позицию, потом устанавливаешь
конец файла на эту позицию:
The SetFilePointer function moves the file pointer of an open file.
DWORD SetFilePointer(
HANDLE hFile, // handle of file
LONG lDistanceToMove, // number of bytes to move file pointer
PLONG lpDistanceToMoveHigh, // address of high-order word of distance to move
DWORD dwMoveMethod // how to move
);
;------------
The SetEndOfFile function moves the end-of-file (EOF) position for the specified file to the current position of the file pointer.
BOOL SetEndOfFile(
HANDLE hFile // handle of file whose EOF is to be set
);
Ответ отправлен: 11.07.2003, 22:08
Отправитель: Евгений Иванов
Отвечает Ayl
Здравствуйте, greg!
Да, возможно. Для этого нужно:
1. Установить указатель файла на нужную позицию (fn 42h прерывания 21h)
2. Выполнить запись в файл с количеством байт равным 0:
xor cx, cx
mov bx, [Handle]
mov ah, 40h
int 21h
Это усечет файл до текущей позиции.
Так как установка позиции с помощью ф-ции 42h может производится от начала файла, от его конца или от текущей позиции, то простор для действий просто громаден! :-)
Ответ отправлен: 11.07.2003, 11:25
Отправитель: Ayl
Отвечает _vt
Приветствую Вас, greg!
Для DOS алгоритм следующий: открываешь файл с правами на запись (ax=3d02h/int21h), перемещаешь указатель на нужную позицию (ax=4200h,bx=хендл файла, cx:dx=смещение от начала файла/int21h), а затем вызываешь функцию 40h(запись в файл или устройство), причем cx=0(записываешь 0 байт). Закрываешь файл (ah=3eh,bx=хендл/int21h). Всё!
---===*** E-Man 1.4 - waiting for 1.5...***===---
Ответ отправлен: 12.07.2003, 01:00
Отправитель: _vt
Отвечает Теоретик
Здравствуйте, greg!
Для обрезания файла используются функции 42h (перемещение указателя файла) и 40h (запись в файл).
Для обрезания файла необходимо поместить указатель на новый конец файла с помощью функции 42h, а затем обрезать его, записав 0 байт с помощью функции 40h.
Это будет выглядеть примерно так:
mov ah, 42h ; номер функции
mov bx, Handle ; дескриптор файла
mov cx, HighNewEnd ; старшие байты позиции нового конца
mov dx, HighOldNew ; младшие байты позиции нового конца
mov al, 0 ; делаем отсчёт от начала файла (можно поставить 1 - от текущей позиции или 2 - от текущего конца файла)
int 21h ; вызываем служебное прерывание DOS
mov ah, 40h
mov bx, Handle
mov cx, 0 ; Количество байт = 0, означает обрезание файла
int 21h
Ответ отправлен: 14.07.2003, 20:15
Отправитель: Теоретик
Вопрос № 3682 |
Доброй жизни, Эксперты!
Я по поводу вчерашнего письма.
Спасибо за вразумление. Хоть дошло, что за глюки такие :)
По просьбе одного из экспертов (Евгения Иванова) посылаю тот кусок кода (см. в приложении). [друганы попросили прогу, которая бы изменяла время создания файлов - чтобы с окошками, ...].
Пишу я это в сях, 6.0, Win32 Application.
ЗЫ: Благодарю за присланные ответы.
Приложение:
Вопрос отправлен: 11.07.2003, 11:06
Отправитель: Ренат (renatka_f@mail.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Евгений Иванов
Добрый день, Ренат!
Так и используй функции win32:
The SetFileTime function sets the date and time that a file was created, last accessed, or last modified.
BOOL SetFileTime(
HANDLE hFile, // identifies the file
CONST FILETIME * lpftCreation, // time the file was created
CONST FILETIME * lpftLastAccess, // time the file was last accessed
CONST FILETIME * lpftLastWrite // time the file was last written
);
typedef struct _FILETIME { // ft
DWORD dwLowDateTime;
DWORD dwHighDateTime;
} FILETIME;
The FILETIME structure is a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601.
Ответ отправлен: 11.07.2003, 22:11
Отправитель: Евгений Иванов
Отвечает Hangatyr
Доброе время суток, Ренат!
Ну если ты создаешь приложение Win32, то файл будет PE-формата и работать он будет в защищенном режиме, следовательно нельзя использовать досовские прерывания. Выход - API SetFileTime установит тебе дату создания или, там изменения...
Ответ отправлен: 11.07.2003, 12:55
Отправитель: Hangatyr
Вопрос № 3683 |
Добрый день ув.Эксперты!
Есть файл (текстовый, doc)
Как под Виндами запретить его
копирование (если можно, то и просмотр)...
Нельзя изменять расширения ф-ла.
Знаю как сделать под Win'98 (через драйвер,
пример Bob Johnson'а прекрасно подходит )..
Но нужно чтобы работало и на ХР...
Спасибо.
pAcU
Вопрос отправлен: 11.07.2003, 13:19
Отправитель: pAcU (pacu@mail.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Gibbel
Доброе время суток, pAcU!
Открываешь его с помощью CreateFile() с dwShareMode = 0.
Либо, смотри LockFile().
Ответ отправлен: 11.07.2003, 13:58
Отправитель: Gibbel
Отвечает Евгений Иванов
Доброе время суток, pAcU!
Попробуй открыть на запись и запретить разделять (share) с другими
программами.
Ответ отправлен: 11.07.2003, 22:12
Отправитель: Евгений Иванов
Отвечает _vt
Здравствуйте, pAcU!
При использовании NTFS можно запретить и доступ, и копирование и просмотр...
---===*** E-Man 1.4 - waiting for 1.5...***===---
Ответ отправлен: 11.07.2003, 18:56
Отправитель: _vt
Отвечает Andy
Приветствую Вас, pAcU!
Самое простое выставить на него права доступа(надеюсь админ может его смотреть?). Правда это только если NTFS.
А вообще если кто-то может просматривать файл, то и копировать он его тоже может.
Ответ отправлен: 12.07.2003, 16:23
Отправитель: Andy
Вопрос № 3685 |
Пpивeт экcпepты!
Тут тaкaя бaдягa - знaчит выделить динaмически кусок пaмяти - пaрa
пустяков, - a трaбла в том, что возврaщается только хендл нa
выделенную облaсть. A мнe трeбуется пoлучить рeaльный oффсeт.
Типa для пapcингa пoтpeбнo.
B кaкую cтopoну кoпaть?
Зapaнee cэнкc!
Вопрос отправлен: 12.07.2003, 01:44
Отправитель: Puffy
[Следующий вопрос >>] [Список вопросов]
Отвечает Евгений Иванов
Добрый день, Puffy!
Используй функцию:
GlobalAlloc, GPTR, размер
Или GMEM_FIXED,
тогда он возвратит не номерок, а адрес.
Или используй эту же функцию с другими флажками, но не забывай
про GlobalLock, номерок
Вот эта функция возвратит тот же адрес.
Потом не забудь GlobalUnLock.
Удачи!
Ответ отправлен: 12.07.2003, 11:24
Отправитель: Евгений Иванов
Отвечает Zedr0n
Приветствую Вас, Puffy!
Юзай GlobalAlloc с флагом GMEM_FIXED, потому как тогда
функция возвращает указатель(то бишь offset).
Вот и все, очень просто. Удачи!
Ответ отправлен: 12.07.2003, 14:42
Отправитель: Zedr0n
Отвечает Bob Johnson
Добрый день, Puffy!
Поставь флаг GMEM_FIXED или используй GlobalLock.
* EMan1.4: ---===*** Have your friend the way you would like him to have you ***===---
Ответ отправлен: 12.07.2003, 16:25
Отправитель: Bob Johnson
Отвечает Теоретик
Приветствую Вас, Puffy!
Если вы имеете ввиду функции GlobalAlloc, то она не всегда возвращает Handle.
HGLOBAL GlobalAlloc(
UINT uFlags, // object allocation attributes
DWORD dwBytes // number of bytes to allocate
);
Если параметр uFlags установить в значение GMEM_FIXED (числовое значение - ноль), то функция
возвращает указатель (или ноль в случае ошибки).
Кусок кода приведён ниже (намеренно не оптимизированный, с целью повышения читабельности).
Приложение:
Ответ отправлен: 12.07.2003, 22:00
Отправитель: Теоретик
Вопрос № 3686 |
Здравствуйте, уважаемые эксперты!
Возможно, вопрос не совсем по теме, но если кто знает, подскажите: есть ли возможность из Setup BIOS (Award
4.51 PG) произвести низкоуровневое форматирование жесткого диска? Если нет, то какими еще средствами можно произвести такое форматирование, не имея ОС
Заранее всем благодарен.
Вопрос отправлен: 12.07.2003, 07:05
Отправитель: Ярослав
[Следующий вопрос >>] [Список вопросов]
Отвечает Broken Sword
Приветствую Вас, Ярослав!
в 4.51PG - никак. В более ранних версиях это было возможно, но и то не во всех. Насчет как произвести низкоуровневое форматирование не имя ОС - не имея ОС вы даже с клавиатуры ввести ничего не сможете (кроме как при POST-е), какое уж там низкоуровневое форматирование. Говорят что существуют программные реалзиации, но я их если честно не видел. Все они, естественно, требуют наличие хоть какой то оси (по крайней мере той, которая способна будет распознать формат файла, в который они заключены)
Ответ отправлен: 12.07.2003, 10:40
Отправитель: Broken Sword
Отвечает Евгений Иванов
Приветствую Вас, Ярослав!
В BIOS-е можно, и в этой версии в том числе.
Там есть и Interleaving.
А ещё есть программки специально для каждого ж.диска.
Ищи в Сети или на сайте производителя.
У меня Fujitsu, вот для него есть такая:
-- Erase --
This procedure performs a pseudo-formatting to the drive. It erases all
of your previous hard disk data and reinitializes it to '00' pattern.
By performing this task, you will be able to erase the whole user area
including your Master Boot Record, Partition Table, FAT
(File Allocation Table), and all the files and data it refers to.
If you have verified that your FUJITSU drive has no errors and doesn't
require a low level factory format, and you want to reinitialize
your drive (i.e. you want to migrate from one OS to another or
you want to re-install your OS but wants to be sure your drive
is clean), then you may want to perform the 'ERASE' function.
Ответ отправлен: 12.07.2003, 11:25
Отправитель: Евгений Иванов
Отвечает Bob Johnson
Приветствую Вас, Ярослав!
Если у тебя в BIOS есть пункт меню "Low Level Format" или что-то такое, то можно. Иначе - нет. Последний раз я видел такие фишки в 486 компах, выше - нет.
К другим средствам относится утилита lf.exe, которая именно это и выполняет. Можешь озадачить ее поиском yandex (вводи в кавычках "lf.exe"). Для ее работы необходима DOS, т.е. загрузочный диск надо будет сделать. Полностью без ОС (кроме как из bios) - нельзя, тогда надо будет винт на другой комп перенести, на котором можно хотя бы с дискеты загрузиться.
* EMan1.4: ---===*** Have your friend the way you would like him to have you ***===---
Ответ отправлен: 12.07.2003, 16:25
Отправитель: Bob Johnson
Отвечает _vt
Добрый день, Ярослав!
В некоторых биосах бывает такая опция: low level format - обычно ей пользоваться не рекомендуется: можно винт угробить, и вообще если винчестеров два, она по ошибке может другой отформатировать... Да и зачем оно надо такое форматирование? Лучше средствами DOS - её всегда можно загрузить с дискеты. Там используются fdisk и format...
---===*** E-Man 1.4 - waiting for 1.5...***===---
Ответ отправлен: 13.07.2003, 01:26
Отправитель: _vt
Отвечает Дмитрий
Доброе время суток, Ярослав!
У меня старая машина. Материнка VIA MVP3. ПЗУ 4.51PG и там есть пункт Low Level Format. Но если я форматну свой новый WD на 20Gb с помощью этой утилитки, то он почти наверняка погибнет. Причина в несовпадении логического распределения секторов с физическим. Контроллер винта при работе принимает логические адреса секторов и переводит в физические, причем это соответствие не является четким и варьируется даже внутри одной линейки винтов. Т. е. для одной модели существуют разные контроллеры! У меня был случай, когда на одном винте полетел контроллер, я нашел такой-же и перестановка ничего не дала, хотя в БИОС он определился! (зависимость от даты выпуска?). Данная утилитка ничего не знает о таком несовпадении и форматит все на свое усмотрение, а оно далеко от совершенства. Скорее всего после этой процедуры резко упадет производительность винта и его емкость. Так что LLF не только не рекомендован, но противопоказан, по крайней мере для современных винтов.
Ответ отправлен: 14.07.2003, 07:59
Отправитель: Дмитрий
Вопрос № 3687 |
Это ответ на вот этот вопрос:
Hi.
Возможно ли из обработчика прерывания (допустим 9)
вызвать процедуру и так, чтоб обработчик не ждал возврата
из процедуры а дальше выполнял свои действия?
Tibor
Дата отправки 06.07.2003, 15:36
;----------------------------------------------------
;Запросто, тут надо со стеком повозиться.
;Это можно сделать и так:
;Например, имеем обработчик 9-го прерывания (клавиатура).
;Входим в него.
;И нужно вызвать какие-либо функции...
;Очень просто; устанавливаем флажок и повышаем частоту таймера.
;Потом у нас есть обработчик таймера.
;В нём идёт обработка этого флажка, и если он вкл., то выполняет действия.
;Потом сбросит этот флажок и установит след., если надо и т.д.
;Теперь насчёт стека:
;Например, имеем обработчик прерывания:
;И нужно выполнить подпрограмму по выходу из обработчика.
;-- INT_80 -----------------------------------------------------------------
int_80_entry: ;=1c
cli
cld
push ds es cs 0b800h
pop es ds
pusha
;!!! working
popa
pop es ds
;тут в стек заносим адрес возврата на НАШУ подпрограмму
push cs
push ofs SubProgram
push bp ax bx
mov bp, sp
;здесь перемешиваем флаги и адреса для нормального выхода
mov ax, [bp+14] ;flags
mov bx, [bp+12] ;cs
mov [bp+14], bx
mov bx, [bp+10] ;ip
mov [bp+12], bx
mov [bp+10], ax
; т.е. сначала выйдет по iret на НАШУ подпрограмму, потом на точку, где
;произошло прерывание.
;НАША подпрограмма должна быть дальняя
pop bx ax bp
iret
;смысл ясен?
;Может я что-то на скорую руку и ошибся в числах, но идея такая...
Вопрос отправлен: 12.07.2003, 11:30
Отправитель: Евгений Иванов (Eugene.Ivanov@land.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Ayl
Приветствую Вас, Евгений Иванов!
Мне кажется, что ты тут что-то хитрое замудрил.
Во-первых, сам вопрос некорректен. Процессор в каждый момент времени может исполнять только одну команду.
Во-вторых, набор регистров в процессоре один (всякие хитрости с теневыми регистрами и т.п. брать в расчет не будем, т.к. программно они недоступны и предназначены только для повышения производительности).
В-третьих, при выполнении обработки прерывания (аппаратного, например, 9-го) при вызове происходит блокирование прерываний как на уровне задачи (с помощью флага IF), так и в контроллере прерываний. Соответственно, прерывание от таймера не будет обработано до того момента, пока обработчик прерывания от клавиатуры не разрешит этого. И никаким повышением частоты таймера ты этого не добьешься.
Самым критичным мне представляется второй пункт. Представь себе, когда вызывается твой обработчик прерываний, ОС сохраняет только CS, IP и флаги. Далее, каким-либо способом ты вызываешь процедуру, которая должна выполняться параллельно с основным обработчиком. Т.е. можно представить, что процессор должен выполнять попеременно то команду из твоей процедуры, то команду из основного обработчика. Теоретически этого можно добиться, выполняя после каждой команды твоей процедуры iret и сохраняя где-то адрес текущей команды. Но практически это задача, ИМХО, невыполнимая.
Вместо таких наворотов лучше использовать защищенный режим - там уже предусмотрен механизм переключения задач. Нужно написать свою процедуру переключения задач, которая будет квантовать время для выполнения каждой из твоих процедур.
Либо использовать возможности ЯВУ для создания потоков - они как раз выполняются параллельно.
Да, кстати, если ты предполагаешь в своей процедуре использовать прерывания DOS или BIOS, то у тебя также могут возникнуть сложности при их вызовах: эти прерывания не поддерживают одновременного обращения к себе из двух задач. Они, как это называется, нереентерабельны.
Ответ отправлен: 14.07.2003, 13:02
Отправитель: Ayl
Вопрос № 3688 |
Добрый день уважаемые эксперты!!!
Подскажите почему компилятор Tasm 5 выдаёт ошибки в строках "(11) и (13)Forward reference needs override", что я зделал нетак????????
С уважением Ujin!!!!
Приложение:
Вопрос отправлен: 12.07.2003, 11:50
Отправитель: Ujin (twixt@rambler.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Tigran K. Kalaidjian
Здравствуйте, Ujin!
Странно. Мой TASM 2.0 Молчит по этому поводу.
Другое дело, что у Вас во второй строчке разделение идёт не запятыми, а точкой с запятой. И еще: сообщение об ошибке выдаётся в любом случае, т.к. в 16-й строчке отсутствует jmp exit
Ответ отправлен: 13.07.2003, 17:09
Отправитель: Tigran K. Kalaidjian
Отвечает Hangatyr
Доброе время суток, Ujin!
Ты, наверное, компилируешь с одним проходом - попробуй запускать tasm с ключом /m3.
Ответ отправлен: 12.07.2003, 13:40
Отправитель: Hangatyr
Отвечает Zedr0n
Здравствуйте, Ujin!
У Вас, например, в строке 11:
mov Hand,ax
А сам Hand объявлен после кода, Tasm такое не переваривает.
Выходов тут несколько:
1) Компилировать с ключом /m#, где #-количество проходов,
сколько должен сделать Tasm. Например, если указать /m3, то
тогда все нормально компилируеются.
2) Поместить данные до кода, например так:
begin:
jmp begin1
messerr db "error open file",0Dh,0Ah,'$'
Hand dw 0ffffh
file db 'text.txt',0
begin1:
3) Можно не извращаться с такими определениями сегментов, и,
так как это .com файл, использовать короткие формы.
Вот, например, так:
.model tiny ; объявить, что это будет .com
.data ; начинаются данные
messerr db "error open file",0Dh,0Ah,'$'
Hand dw 0ffffh
file db 'text.txt',0
.code
org 100h
;дальше идет сам код
Это еще удобней, так как если в .data объявляются
неинициализированные данные(db ?), то в файле не
появляются лишние нулевые байты. Так например, можно
было бы сэкономить 2 байта(всего 4, учитывая ликвидацию
прыжка):
.data
messerr db "error open file",0Dh,0Ah,'$'
file db 'text.txt',0
Hand dw ?
Удачи!
Ответ отправлен: 12.07.2003, 14:54
Отправитель: Zedr0n
Отвечает Bob Johnson
Доброе время суток, Ujin!
Попробуй компилировать в два прохода (ключ /m2).
* EMan1.4: ---===*** Have your friend the way you would like him to have you ***===---
Ответ отправлен: 12.07.2003, 16:25
Отправитель: Bob Johnson
Отвечает Теоретик
Добрый день, Ujin!
У вас используется forward reference, т.е. обращение к идентификатору, который описан позже (в данном случае - Hand). Такие обращения могут быт обработаны только в два прохода: на первом компилятор определяет адреса всех меток и переменных, а во время второго генерирует код, уже зная что где находится.
По умолчанию Tasm использует однопроходный режим. Для включения двухпроходного используйте опцию /m2.
Например:
tasm /m2 file.asm
Ответ отправлен: 12.07.2003, 22:00
Отправитель: Теоретик
Отвечает _vt
Приветствую Вас, Ujin!
Компилятору надо указать ключ /m - использование нескольких проходов исходного текста, для определения всех переменных. А вообще в конкретно этой программе можно сделать проще - без переменной hand - push ax; pop bx.
---===*** E-Man 1.4 - waiting for 1.5...***===---
Ответ отправлен: 13.07.2003, 01:26
Отправитель: _vt
Отвечает St
Привет, Ujin!
Вы определили переменную Hand не в сегменте данных, где компилятор ее хотел бы видеть :) , а в сегменте кода ПОСЛЕ того места где вы ее используете, а он это не любит.
St
Ответ отправлен: 14.07.2003, 12:05
Отправитель: St
Форма отправки вопроса |
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.
(C) 2002-2003 Команда RusFAQ.ru.
Вопрос и дополнение |
Ваш вопрос:
Приложение (если необходимо):
Получить ответов:
Выбор рассылки |
Программисту Assembler (35) C / C++ (23) Perl (6) Builder / Delphi (17) Pascal (24) Basic / VBA (10) Java / JavaScript (12) PHP (10) MySQL / MSSQL (9) Криптография (7) WinAPI (10) |
Пользователю Windows 95/98/Me (34) Windows NT/2000/XP (28) "Железо" (25) Поиск информации (17) |
Администратору Windows NT/2000/XP (16) Linux / Unix (6) |
Юристу Гражданское право (10) Семейное право (5) Трудовое право (9) КоАП (5) |
Отправить вопрос всем экспертам выбранной рассылки.
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
Профессиональная WEB-Студия B.I.T.
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||