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

» Вопросы по Delphi (до версии 2009) - часть 6

Автор: Frodo_Torbins
Дата сообщения: 09.10.2011 16:50
R3Pa4eK
Удалите из юзес Forms и StdCtrls, но я сомневаюсь, что это сильно поможет. Большего эффекта можно добиться только отказавшись от ImageEn.
Автор: Varenik
Дата сообщения: 09.10.2011 20:56
R3Pa4eK
а в ресурсе ISLogo.res что?
Автор: R3Pa4eK
Дата сообщения: 09.10.2011 20:57
Varenik
Version Info и все...
Автор: Frodo_Torbins
Дата сообщения: 09.10.2011 23:04
R3Pa4eK
Я тут подумал: чем подход ImageEn отличается от вашего предыдущего? Только одним: вы пытались рисовать прямо на чужом окне, а ImageEn создает свое в нужном месте, и рисует уже на нем. Вам нужно повторить этот фокус и тогда вы сможете сделать очень маленькую длл-ку, которая нормально рисует картинки. Пример: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1411
Автор: DmitryKz
Дата сообщения: 10.10.2011 09:44
Скажите, а есть ли функции для преобразования путей вида
Код: ..\..\_FlightsCommon\FS9\Addon Scenery\Alps 19m by Taburet
Автор: DmitryKz
Дата сообщения: 10.10.2011 14:07
Совершенно потерялся в вопросе конвертации массива байтов (представляющих ascii-коды) в строку.

В этом коде

Код:
buff: array of Byte;
PCh: PChar;
s: String;
ldat, ld: Integer;
...
ldat := sizeof(nameitem.Len);
BglF.Read(buff, ldat);
nameitem.Len := DWORD(&buff);

ldat := nameitem.Len - sizeof(nameitem.Id) - sizeof(nameitem.Len);
ld := ldat - 1;
BglF.Read(buff, ldat);
Pch := PChar(@buff[Low(buff)]);
s := '';
SetString(s, PCh, ld);
Автор: my610
Дата сообщения: 10.10.2011 14:59
DmitryKz, что-то вы тут на извращались
1) что такое BglF, это TFileStream?
2) где происходит инициализация buff ?
3) прочитать строчку можно без всяких таких танцев, тем более длина ее известна

Цитата:
Pch := PChar(@buff[Low(buff)]);
s := '';
SetString(s, PCh, ld);

Автор: DmitryKz
Дата сообщения: 10.10.2011 15:20
my610
Вы совершенно правы, по поводу извращений. Решил прекратить с ними и нашёл естественное:

Код: String(PChar(@buff));
Автор: Maks150988
Дата сообщения: 13.10.2011 20:10
Многоуважаемые гуру, а есть ли стандартная функция, делающая ксор или ор для двордов наподобие?


Код: procedure SetExStyle(dwExStyle: DWORD; bexStyle: Boolean);
begin
if bexStyle then
dwRet := dwRet or dwExStyle
else
dwRet := dwRet xor dwExStyle;
end;
Автор: Aleksandr N
Дата сообщения: 13.10.2011 22:58
Здесь есть люди знающие DirectShow на Delphi?
Есть пару мелких вопросов. Отзовитесь в ПМ.
Спасибо.
Автор: akaGM
Дата сообщения: 14.10.2011 00:26
Maks150988
что такое "стандартная"?
Автор: rrromano
Дата сообщения: 14.10.2011 13:57
Maks150988
А вы проверяли результат побитовой операции с операндами типа двойное слово?
Можно, впрочем, через целочисельное деление и остаток деления смастерить ).
Автор: R3Pa4eK
Дата сообщения: 15.10.2011 15:07
Имеется файл (png), который занят чужой программой. Мне нужно его удалить. Как это сделать программно?

Автор: Frodo_Torbins
Дата сообщения: 15.10.2011 17:15
R3Pa4eK
Попросите систему удалить его при перезагрузке: http://weseetips.com/2008/05/19/how-to-mark-your-file-for-deletion-after-next-reboot/
Автор: R3Pa4eK
Дата сообщения: 15.10.2011 17:19
Frodo_Torbins
Мне это не подходит. В моем случае нужно узнать хэндл файла и закрыть его. Как узнать хэндл я знаю, а вот как закрыть хз.
Автор: Frodo_Torbins
Дата сообщения: 15.10.2011 17:35
R3Pa4eK
По-моему для этого нужно создавать поток в процессе, который держит хендл, и закрывать его из этого потока. Такие действия конечно могут вызвать подозрения у антивирей, да и обход системы безопасности винды тоже потребуется.
Вообще вы немного неверный топик выбрали для обсуждения таких вопросов.
Автор: R3Pa4eK
Дата сообщения: 15.10.2011 17:40
Frodo_Torbins
А можно изменить права доступа к файлу? То-есть сделать так, чтобы его нельзя было скопировать.
Автор: my610
Дата сообщения: 15.10.2011 17:43
R3Pa4eK
Цитата:
Мне это не подходит. В моем случае нужно узнать хэндл файла и закрыть его. Как узнать хэндл я знаю, а вот как закрыть хз.

DuplicateHandle с флагом DUPLICATE_CLOSE_SOURCE не?
я пологаю вы через ZwQuerySystemInformation хэндл получаете?
Автор: R3Pa4eK
Дата сообщения: 15.10.2011 18:01
my610
Имеется такой код для получения хэндла:
[more=Код]
type
NT_STATUS = Cardinal;
PSYSTEM_HANDLE_INFORMATION = ^SYSTEM_HANDLE_INFORMATION;
SYSTEM_HANDLE_INFORMATION = packed record
ProcessId: DWORD;
ObjectTypeNumber: Byte;
Flags: Byte;
Handle: Word;
pObject: Pointer;
GrantedAccess: DWORD;
end;

PSYSTEM_HANDLE_INFORMATION_EX = ^SYSTEM_HANDLE_INFORMATION_EX;
SYSTEM_HANDLE_INFORMATION_EX = packed record
NumberOfHandles: dword;
Information: array [0..0] of SYSTEM_HANDLE_INFORMATION;
end;

PFILE_NAME_INFORMATION = ^FILE_NAME_INFORMATION;
FILE_NAME_INFORMATION = packed record
FileNameLength: ULONG;
FileName: array [0..MAX_PATH - 1] of WideChar;
end;

PIO_STATUS_BLOCK = ^IO_STATUS_BLOCK;
IO_STATUS_BLOCK = packed record
Status: NT_STATUS;
Information: DWORD;
end;

PGetFileNameThreadParam = ^TGetFileNameThreadParam;
TGetFileNameThreadParam = packed record
hFile: THandle;
Data: array [0..MAX_PATH - 1] of Char;
Status: NT_STATUS;
end;

function NtQuerySystemInformation(ASystemInformationClass: DWORD;
ASystemInformation: Pointer; ASystemInformationLength: DWORD;
AReturnLength: PDWORD): NT_STATUS; stdcall; external 'ntdll.dll';

function NtQueryInformationFile(FileHandle: THandle;
IoStatusBlock: PIO_STATUS_BLOCK; FileInformation: Pointer;
Length: DWORD; FileInformationClass: DWORD): NT_STATUS;
stdcall; external 'ntdll.dll';

implementation





const
STATUS_SUCCESS = NT_STATUS($00000000);
STATUS_INFO_LENGTH_MISMATCH = NT_STATUS($C0000004);
FileNameInformation = 9;
SystemHandleInformation = 16;

function GetInfoTable(ATableType: DWORD): Pointer;
var
dwSize: DWORD;
pPtr: Pointer;
begin
dwSize := $10000;
pPtr:=nil;
repeat
inc(dwSize,dwSize);
ReallocMem(pPtr, dwSize);
until NtQuerySystemInformation(ATableType, pPtr, dwSize, nil)<>STATUS_INFO_LENGTH_MISMATCH;
Result := pPtr;
end;

function GetFileNameThread(lpParameters: Pointer): DWORD; stdcall;
var
FileNameInfo: FILE_NAME_INFORMATION;
IoStatusBlock: IO_STATUS_BLOCK;
pThreadParam: PGetFileNameThreadParam;
begin
ZeroMemory(@FileNameInfo, SizeOf(FILE_NAME_INFORMATION));
pThreadParam := PGetFileNameThreadParam(lpParameters);
Result := NtQueryInformationFile(pThreadParam^.hFile, @IoStatusBlock,
@FileNameInfo, MAX_PATH * 2, FileNameInformation);
if Result = STATUS_SUCCESS then
begin
pThreadParam^.Status := STATUS_SUCCESS;
WideCharToMultiByte(CP_ACP, 0,
@FileNameInfo.FileName[0], IoStatusBlock.Information,
@pThreadParam^.Data[0],
MAX_PATH, nil, nil);
end;
ExitThread(Result);
end;

function GetFileNameFromHandle(hFile: THandle): String;
var
lpExitCode: DWORD;
pThreadParam: TGetFileNameThreadParam;
hThread: THandle;
begin
Result := '';
ZeroMemory(@pThreadParam, SizeOf(TGetFileNameThreadParam));
pThreadParam.hFile := hFile;
hThread := CreateThread(nil, 0, @GetFileNameThread, @pThreadParam, 0, PDWORD(nil)^);
if hThread <> 0 then begin
case WaitForSingleObject(hThread, 100) of
WAIT_OBJECT_0:
begin
GetExitCodeThread(hThread, lpExitCode);
if lpExitCode = STATUS_SUCCESS then
Result := pThreadParam.Data;
end;
WAIT_TIMEOUT:
TerminateThread(hThread, 0);
end;
CloseHandle(hThread);
end;
end;

function GetFileHandle(SubFileName:string):THandle;
var
hFile: THandle;
pHandleInfo: PSYSTEM_HANDLE_INFORMATION_EX;
I: Integer;
ObjectTypeNumber1: Byte;
FilePath: String;
MyProcID:Cardinal;
begin
result:=0;
ObjectTypeNumber1 := 0;
hFile := CreateFile('NUL', GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
if hFile <> INVALID_HANDLE_VALUE then begin
pHandleInfo := GetInfoTable(SystemHandleInformation);
if pHandleInfo <> nil then begin;
MyProcID:=GetCurrentProcessId;
for I := pHandleInfo^.NumberOfHandles - 1 downto 0 do
with pHandleInfo^.Information[I] do begin
if Handle = hFile then
if ProcessId = MyProcID then
begin
ObjectTypeNumber1 := ObjectTypeNumber;
Break;
end;
end;
CloseHandle(hFile);
for I := pHandleInfo^.NumberOfHandles - 1 downto 0 do begin
with pHandleInfo^.Information[I] do begin
if ObjectTypeNumber = ObjectTypeNumber1 then begin
if ProcessId=MyProcID then begin
FilePath := GetFileNameFromHandle(Handle);
if (FilePath <> '') and (pos(SubFileName,FilePath)>0) then begin
result:=Handle;
break;
end;
end;
end;
end;
end;
end;
end;
end;
[/more]

Добавлено:
my610
Вот [more=так]
function UnLockFile(FileName: AnsiString): bool; stdcall;
var
fn, newfn: THandle;
_new: PHandle;
begin
fn:= GetFileHandle(FileName);
Result:= DuplicateHandle(fn, newfn,
GetCurrentProcess, 0,
0, true, DUPLICATE_CLOSE_SOURCE);
end;
[/more] не катит
Автор: my610
Дата сообщения: 15.10.2011 18:25
R3Pa4eK, попробуйте примерно так:

Код:
............
if (FilePath <> '') and (pos(SubFileName,FilePath)>0) then begin
result:=Handle;
                
                 hProcess:= OpenProcess(PROCESS_DUP_HANDLE, True, pHandleInfo^.Information[I].ProcessId);
                 if (hProcess <> 0) then try

                    if DuplicateHandle(hProcess,
                                     pHandleInfo^.Information[I].Handle,
                                     GetCurrentProcess,
                                     @hFile,
                                     0,
                                     True,
                                     DUPLICATE_CLOSE_SOURCE) then
                    CloseHandle(hFile);
                finally
                    CloseHandle(hProcess);
                end;                
break;
end;
Автор: R3Pa4eK
Дата сообщения: 15.10.2011 18:33
my610
Не работает..
Автор: my610
Дата сообщения: 15.10.2011 18:38
R3Pa4eK, какая система, что за процесс с какими правами, и под какой учетной записью работает?
использую почти подобный код, под админом с WinXP до Win7 проблем не возникало, единственное в семерке есть некоторые тонкости, которые надо учитывать, ну и если процесс системный, то нужны привилегии отладчика получать
Автор: R3Pa4eK
Дата сообщения: 15.10.2011 18:47
my610
Win7, файл изображения (png), который используется библиотекой под названием botva2.dll. Работаю под учеткой админа. [more=Вот]
library BSp2ll;

uses
Windows, AclAPI, AccCtrl, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;
type
NT_STATUS = Cardinal;
PSYSTEM_HANDLE_INFORMATION = ^SYSTEM_HANDLE_INFORMATION;
SYSTEM_HANDLE_INFORMATION = packed record
ProcessId: DWORD;
ObjectTypeNumber: Byte;
Flags: Byte;
Handle: Word;
pObject: Pointer;
GrantedAccess: DWORD;
end;

PSYSTEM_HANDLE_INFORMATION_EX = ^SYSTEM_HANDLE_INFORMATION_EX;
SYSTEM_HANDLE_INFORMATION_EX = packed record
NumberOfHandles: dword;
Information: array [0..0] of SYSTEM_HANDLE_INFORMATION;
end;

PFILE_NAME_INFORMATION = ^FILE_NAME_INFORMATION;
FILE_NAME_INFORMATION = packed record
FileNameLength: ULONG;
FileName: array [0..MAX_PATH - 1] of WideChar;
end;

PIO_STATUS_BLOCK = ^IO_STATUS_BLOCK;
IO_STATUS_BLOCK = packed record
Status: NT_STATUS;
Information: DWORD;
end;

PGetFileNameThreadParam = ^TGetFileNameThreadParam;
TGetFileNameThreadParam = packed record
hFile: THandle;
Data: array [0..MAX_PATH - 1] of Char;
Status: NT_STATUS;
end;


function NtQuerySystemInformation(ASystemInformationClass: DWORD;
ASystemInformation: Pointer; ASystemInformationLength: DWORD;
AReturnLength: PDWORD): NT_STATUS; stdcall; external 'ntdll.dll';

function NtQueryInformationFile(FileHandle: THandle;
IoStatusBlock: PIO_STATUS_BLOCK; FileInformation: Pointer;
Length: DWORD; FileInformationClass: DWORD): NT_STATUS;
stdcall; external 'ntdll.dll';

const
STATUS_SUCCESS = NT_STATUS($00000000);
STATUS_INVALID_INFO_CLASS = NT_STATUS($C0000003);
STATUS_INFO_LENGTH_MISMATCH = NT_STATUS($C0000004);
STATUS_INVALID_DEVICE_REQUEST = NT_STATUS($C0000010);
ObjectNameInformation = 1;
FileDirectoryInformation = 1;
FileNameInformation = 9;
SystemProcessesAndThreadsInformation = 5;
SystemHandleInformation = 16;


type
TFree = procedure;

var
DLLHandle: THandle;
Free: TFree;

procedure LibSetFileAttribs(FileName: pchar); stdcall;
begin
SetFileSecurity(PChar(FileName), SACL_SECURITY_INFORMATION, nil);
SetFileAttributes(PChar(FileName), fmOpenRead+fmShareExclusive+$00004000+$00002000+$00001000+$00000100+$00000020+$00000010+$00000800+$00000400+$00000200+$0000004+FILE_ATTRIBUTE_HIDDEN+FILE_ATTRIBUTE_SYSTEM);
end;

procedure LibSetDirAttribs(DirName: PChar); stdcall;
begin
SetFileSecurity(PChar(DirName), SACL_SECURITY_INFORMATION, nil);
SetFileAttributes(PChar(DirName), fmShareExclusive+$00004000+$00002000+$00001000+$00000020+$00000010+$00000800+$00000400+$00000200+$0000004+FILE_ATTRIBUTE_HIDDEN+FILE_ATTRIBUTE_SYSTEM);
end;

procedure RemoveFileTree(Path: AnsiString); stdcall;
var
Found: currency;
SearchRec: TSearchRec;
FileName: ansistring;
begin
Found:= FindFirst(Path + '\*.*', faAnyFile, SearchRec);
while Found = 0 do
begin
if ((SearchRec.Attr and faDirectory) = faDirectory)
then
if (SearchRec.Name <> '.') and (SearchRec.Name <> '..')
then RemoveFileTree(Path+'\'+SearchRec.Name)
else
else
begin
FileName:= Path+'\'+SearchRec.Name+#0;
DeleteFile(PChar(FileName));
end;
Found:= FindNext(SearchRec);
end;
SysUtils.FindClose(SearchRec);
RemoveDir(Path);
end;

function GetInfoTable(ATableType: DWORD): Pointer;
var
dwSize: DWORD;
pPtr: Pointer;
begin
dwSize := $10000;
pPtr:=nil;
repeat
inc(dwSize,dwSize);
ReallocMem(pPtr, dwSize);
until NtQuerySystemInformation(ATableType, pPtr, dwSize, nil)<>STATUS_INFO_LENGTH_MISMATCH;
Result := pPtr;
end;

function GetFileNameThread(lpParameters: Pointer): DWORD; stdcall;
var
FileNameInfo: FILE_NAME_INFORMATION;
IoStatusBlock: IO_STATUS_BLOCK;
pThreadParam: PGetFileNameThreadParam;
begin
ZeroMemory(@FileNameInfo, SizeOf(FILE_NAME_INFORMATION));
pThreadParam := PGetFileNameThreadParam(lpParameters);
Result := NtQueryInformationFile(pThreadParam^.hFile, @IoStatusBlock,
@FileNameInfo, MAX_PATH * 2, FileNameInformation);
if Result = STATUS_SUCCESS then
begin
pThreadParam^.Status := STATUS_SUCCESS;
WideCharToMultiByte(CP_ACP, 0,
@FileNameInfo.FileName[0], IoStatusBlock.Information,
@pThreadParam^.Data[0],
MAX_PATH, nil, nil);
end;
ExitThread(Result);
end;

function GetFileNameFromHandle(hFile: THandle): String;
var
lpExitCode: DWORD;
pThreadParam: TGetFileNameThreadParam;
hThread: THandle;
begin
Result := '';
ZeroMemory(@pThreadParam, SizeOf(TGetFileNameThreadParam));
pThreadParam.hFile := hFile;
hThread := CreateThread(nil, 0, @GetFileNameThread, @pThreadParam, 0, PDWORD(nil)^);
if hThread <> 0 then begin
case WaitForSingleObject(hThread, 100) of
WAIT_OBJECT_0:
begin
GetExitCodeThread(hThread, lpExitCode);
if lpExitCode = STATUS_SUCCESS then
Result := pThreadParam.Data;
end;
WAIT_TIMEOUT:
TerminateThread(hThread, 0);
end;
CloseHandle(hThread);
end;
end;

function GetFileHandle(SubFileName: ansistring):THandle; stdcall;
var
hFile: THandle;
pHandleInfo: PSYSTEM_HANDLE_INFORMATION_EX;
I: Integer;
ObjectTypeNumber1: Byte;
FilePath: AnsiString;
MyProcID: Cardinal;
hProcess: DWORD;
begin
result:=0;
ObjectTypeNumber1 := 0;
hFile := CreateFile('NUL', GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
if hFile <> INVALID_HANDLE_VALUE then begin
pHandleInfo := GetInfoTable(SystemHandleInformation);
if pHandleInfo <> nil then begin;
MyProcID:=GetCurrentProcessId;
for I := pHandleInfo^.NumberOfHandles - 1 downto 0 do
with pHandleInfo^.Information[I] do begin
if Handle = hFile then
if ProcessId = MyProcID then
begin
ObjectTypeNumber1 := ObjectTypeNumber;
Break;
end;
end;
CloseHandle(hFile);
for I := pHandleInfo^.NumberOfHandles - 1 downto 0 do begin
with pHandleInfo^.Information[I] do begin
if ObjectTypeNumber = ObjectTypeNumber1 then begin
if ProcessId=MyProcID then begin
FilePath := GetFileNameFromHandle(Handle);
if (FilePath <> '') and (pos(SubFileName,FilePath)>0) then begin
result:=Handle;

hProcess:= OpenProcess(PROCESS_DUP_HANDLE, True, pHandleInfo^.Information[I].ProcessId);
if (hProcess <> 0) then try

if DuplicateHandle(hProcess,
pHandleInfo^.Information[I].Handle,
GetCurrentProcess,
@hFile,
0,
True,
DUPLICATE_CLOSE_SOURCE) then
CloseHandle(hFile);
finally
CloseHandle(hProcess);
end;
break;
end;
end;
end;
end;
end;
end;
end;
end;

procedure LibGdipShutdown(DirName: AnsiString); stdcall;
begin
try
DLLHandle := LoadLibrary ('botva2.dll');

if DLLHandle <> 0 then
begin
@Free := getProcAddress (DLLHandle, 'gdipShutdown');
end;
if addr (Free) <> nil then
begin
Free;
end;
finally end;
FreeLibrary (DLLHandle);
RemoveFileTree(DirName);
end;

exports LibSetFileAttribs;
exports GetFileHandle;
exports LibGdipShutdown;
exports LibSetDirAttribs;
exports RemoveFileTree;

begin
end.
[/more] весь код dll.
Автор: Frodo_Torbins
Дата сообщения: 15.10.2011 18:57
R3Pa4eK
А Process Explorer в колонке Integrity для вашего процесса что показывает?
Автор: R3Pa4eK
Дата сообщения: 15.10.2011 19:08
Frodo_Torbins
Вы это о чем?
Автор: my610
Дата сообщения: 15.10.2011 19:21
R3Pa4eK, погодите что то я не понял, вы загружаете дилку botva2.dll в своей программе?
Автор: R3Pa4eK
Дата сообщения: 15.10.2011 19:22
my610
Да.
Автор: my610
Дата сообщения: 15.10.2011 19:42
R3Pa4eK, тогда следующие вопросы:
- дилка ваша
- как происходит загрузка либы
- если дилка ваша, то корректно ли высвобождаются ресурсы и закрываются дескрипторы в ней
Автор: R3Pa4eK
Дата сообщения: 15.10.2011 19:50
my610

Цитата:
дилка ваша

botva2.dll - нет. Либа хтуоса.

Цитата:
- как происходит загрузка либы

Статически.
Автор: GRom V
Дата сообщения: 20.10.2011 03:56
Помогите -такая задача есть ветка в реестре
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}

В ней много подключей,(0001, 0002, 0003 и т.д) но в одном из них есть строковый параметр NetworkAddress с значением 001635A790B9

Как его найти?

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374

Предыдущая тема: MPO File


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