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

» Вопросы по Delphi 2

Автор: SERGE_BLIZNUK
Дата сообщения: 20.08.2006 11:20
kzsergo
Скорее все же, как сказал жестоко, но справедливо ShIvADeSt - "Никак." $-))
потому как хоть что-то надо знать о той функции/форме, которую вы хотите получить ;-))
ну ладно, если человек пытлив, тогда не помешает ещё почитать про DLL Руководство по созданию DLL (progz.ru)
особенно глава 3. 3.2. Как получить таблицу экспортируемых имен? [more]
Все экспортируемые имена DLL компоновщик (линкер) помещает в специальную таблицу в секции экспорта PE-файла. Каждый элемент в этой таблице содержит имя экспортируемой функции или переменной, а также относительный адрес этой функции или переменной (RVA – relative virtual address) внутри DLL-файла. Все списки имен сортируются по алфавиту.

Воспользовавшись утилитой dumpbin.exe с ключом -exports из состава Microsoft Visual Studio, вы можете увидеть содержимое секции экспорта DLL. [/more]
удачи.



Автор: Jokerjar
Дата сообщения: 20.08.2006 18:52

Цитата:
Подскажите как вытащить из чужой библиотеки какую-нибудь функцию

В смысле экспортировать? В неоторых редакторах ресурсов (например, Exescope) можно просмотреть список всех экспортируемых функций в dll (без параметров)
Автор: ShIvADeSt
Дата сообщения: 21.08.2006 01:07
Jokerjar

Цитата:
В смысле экспортировать? В неоторых редакторах ресурсов (например, Exescope) можно просмотреть список всех экспортируемых функций в dll (без параметров)  

Ага, а потом эмпирически подбирать что нужно туда передавать . А одних названий мало, для экспорта функций.
Автор: xitsmex
Дата сообщения: 21.08.2006 08:59

Цитата:
Воспользовавшись утилитой dumpbin.exe с ключом -exports из состава Microsoft Visual Studio, вы можете увидеть содержимое секции экспорта DLL.
В рамках Delphi можно воспользоваться tdump - так же покажет экспортируемые функции.

Автор: Jokerjar
Дата сообщения: 21.08.2006 15:09
ShIvADeSt, иногда можно и догадаться о параметрах по названию
Автор: kzsergo
Дата сообщения: 21.08.2006 17:38
Подскажите, как можно открыть, напирмер, у Word-а окно 'Абзац' или какое-нибудь другое окно с параметрами. Или же у INTERNET EXPLORER окно 'Свойства обозревателя'. Тоесть мне нужно открыть модальную форму чужого приложения. При это я знаю все параметры этого окна, например класс.

Как снять какой-нибудь из флажков (если таковы присутствуют) в данных окнах?
Автор: ShIvADeSt
Дата сообщения: 22.08.2006 00:53
kzsergo

Цитата:
Подскажите, как можно открыть, напирмер, у Word-а окно 'Абзац' или какое-нибудь другое окно с параметрами. Или же у INTERNET EXPLORER окно 'Свойства обозревателя'. Тоесть мне нужно открыть модальную форму чужого приложения.

Если оно создано и просто скрыто, тогда делаешь поиск по классу и посылаешь ShowWindow(hWnd,SW_SHOW) если же окно, не создано, а создается только при клике на пункт меню, то эмулируй нажатие кнопок для меню, чтобы его вызвать.
Автор: platypus
Дата сообщения: 22.08.2006 10:23
А кто может подсказать про написание чата на DCOM? Любая помощь ...
Автор: kzsergo
Дата сообщения: 22.08.2006 13:13

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


Как это делается?


Цитата:
Если оно создано и просто скрыто


Несовсем понял, что значит создано и что значит скрыто?
Автор: greenpc
Дата сообщения: 22.08.2006 14:53
kzsergo
а если пойти другим путем.
для IE можно через реестр
Reg := TRegistry.Create;
Reg.RootKey := HKEY_CURRENT_USER;
Reg.OpenKey('Software\Microsoft\Internet Explorer\Main', False);
а для word'a через OLE

Автор: kzsergo
Дата сообщения: 22.08.2006 18:19
Есть какие-то ещё варианты?
Подскажите ещё:
Как эмулировать нажатие кнопок чужого приложения, не открывая его?
Как снять какой-нибудь из флажков чужого приложения???????
Автор: xitsmex
Дата сообщения: 22.08.2006 19:38

Цитата:
Есть какие-то ещё варианты?
Подскажите ещё:
Как эмулировать нажатие кнопок чужого приложения, не открывая его?
Как снять какой-нибудь из флажков чужого приложения???????

Пока не опишите задачу - так и будете довольствоваться односложными ответами.
Автор: kzsergo
Дата сообщения: 22.08.2006 20:33

Цитата:
Пока не опишите задачу


К примеру мне нужно написать прогу которая бы позволяла снять (поставить) флажок в чужом приложении. Например я хочу поставить (снять) флажок в приложении Internet Explorer/Сервис/Свойства обозравателя/Дополнительно/отображать рисунки.

С эмулированием нажатием кнопки и клавиши на чужом приложении разобрался. Всё оказалось не, так сложно как я предполагал.
Автор: ShIvADeSt
Дата сообщения: 23.08.2006 00:39

Цитата:
Например я хочу поставить (снять) флажок в приложении Internet Explorer/Сервис/Свойства обозравателя/Дополнительно/отображать рисунки.  

В реестре если мне не изменяет память все это хранится, где имено - ищи сам, в любом случае чекбоксы просто отображают состояние флагов в реестре, после изменния реестра не забудь послать что реестр изменился, хотя возможно ИЕ и пофигу на это будет.
Автор: dmit000
Дата сообщения: 23.08.2006 05:02
напишите пожалуйсто код на АПИ для перезагрузки и выключения WINXP
Автор: SERGE_BLIZNUK
Дата сообщения: 23.08.2006 06:06
dmit000

Цитата:
пожалуйсто код на АПИ для перезагрузки и выключения WINXP

выдернул из DelphiWorld [more=Как выключить компьютер с любой версией Windows]

Код:
function GetWinVersion: string;
var
VersionInfo: TOSVersionInfo;
OSName: string;
begin
// устанавливаем размер записи
VersionInfo.dwOSVersionInfoSize := SizeOf( TOSVersionInfo );
if Windows.GetVersionEx( VersionInfo ) then
begin
with VersionInfo do
begin
case dwPlatformId of
VER_PLATFORM_WIN32s: OSName := 'Win32s';
VER_PLATFORM_WIN32_WINDOWS: OSName := 'Windows 95';
VER_PLATFORM_WIN32_NT: OSName := 'Windows NT';
end; // case dwPlatformId
Result := OSName + ' Version ' + IntToStr( dwMajorVersion ) + '.' + IntToStr( dwMinorVersion ) +
#13#10' (Build ' + IntToStr( dwBuildNumber ) + ': ' + szCSDVersion + ')';
end; // with VersionInfo
end // if GetVersionEx
else
Result := '';
end;

procedure ShutDown;
const
SE_SHUTDOWN_NAME = 'SeShutdownPrivilege'; // Borland forgot this declaration
var
hToken: THandle;
tkp: TTokenPrivileges;
tkpo: TTokenPrivileges;
zero: DWORD;
begin
if Pos('Windows NT', GetWinVersion) = 1 then // we've got to do a whole buch of things
begin
zero := 0;
if not OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
begin
MessageBox(0, 'Exit Error', 'OpenProcessToken() Failed', MB_OK);
Exit;
end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)

if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
begin
MessageBox(0, 'Exit Error', 'OpenProcessToken() Failed', MB_OK);
Exit;
end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)

// SE_SHUTDOWN_NAME
if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[0].Luid ) then
begin
MessageBox(0, 'Exit Error', 'LookupPrivilegeValue() Failed', MB_OK);
Exit;
end; // if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[0].Luid )

tkp.PrivilegeCount := 1;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;

AdjustTokenPrivileges(hToken, False, tkp, SizeOf( TTokenPrivileges ), tkpo, zero);
if Boolean(GetLastError()) then
begin
MessageBox(0, 'Exit Error', 'AdjustTokenPrivileges() Failed', MB_OK);
Exit;
end // if Boolean( GetLastError() )
else
ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN, 0 );

end // if OSVersion = 'Windows NT'
else
begin // just shut the machine down
ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN, 0 );
end; // else
end;
Автор: dmit000
Дата сообщения: 23.08.2006 18:42
SERGE_BLIZNUK
спасибо за ответ
Автор: sunduk4
Дата сообщения: 24.08.2006 10:45
Подскажите, можно ли как-то определить, что курсор находится на последней видимой записи выпадающего спика комбобокса и перехватить попытку скрола этого выпадающего спика? Задача - сыпать в комбобокс единовременно только видимое кол-во записей и, при попытке переместиться ниже, добавлять такое же количество записей.
Автор: kzsergo
Дата сообщения: 24.08.2006 12:45
Подскажите, как можно задержать посылку сообщения? Например я написал прогу, которая открывает какое-нибудь чужое приложение, затем посылается ему сообщение, но всегда получается так, что сообщение посылается раньше запуска программы, хотя должено происходить наоборот - запускаться приложение затем посылаться ему сообщение. Вот как временно приостановить посылку сообщения до запуска программы, не используя таймер?
Автор: sunduk4
Дата сообщения: 24.08.2006 12:51
kzsergo
в цикле ищи через FindWindow окно своей программы, если не найдено - sleep.
Автор: kzsergo
Дата сообщения: 24.08.2006 17:59
Что такое Sleep?

Цитата:
Подскажите, как можно задержать посылку сообщения?

как еще можно сделать?
Автор: FireZone
Дата сообщения: 24.08.2006 18:32
kzsergo
Цитата:
Что такое Sleep?
Функция windows, которая приостанавливает выполнение потока на указанное количество миллисекунд.
Цитата:
как еще можно сделать?
Извращаться можно всяко. Я вижу только два общих способа задержки: крутить холостой цикл, что есть нагрузка на процессор; блокировать поток (например, функцией Sleep). Можно крутить Sleep в цикле с проверкой существования окна на каждом проходе, как было предложено выше. Метод хорош тем, что не создаёт лишней нагрузки на процессор и позволяет не ждать лишнего.
Автор: dmit000
Дата сообщения: 25.08.2006 07:51
SERGE_BLIZNUK

ExitWindowsEx(EWX_REBOOT or ewx_force,0); - для перезагрузки компютера
ExitWindowsEx(EWX_POWEROFF or ewx_force,0); - для выключения компютера

команды в Win XP не работают. вероятно я чтото не то пишу в разделе Uses. я там записал ShellApi

что нужно писать в разделе Uses
Автор: FireZone
Дата сообщения: 25.08.2006 09:03
dmit000
Из справки
Цитата:
To shut down or restart the system, the calling process must use the AdjustTokenPrivileges function to enable the SE_SHUTDOWN_NAME privilege
Короче говоря, права надо заиметь на перезагрузку или выключение. Если прога компилируется, то Uses здесь совершенно не виноват.
Автор: dmit000
Дата сообщения: 25.08.2006 12:14
FireZone

а вот пример, но конкретный можно
Автор: SERGE_BLIZNUK
Дата сообщения: 25.08.2006 12:49
dmit000

Цитата:
выдернул из DelphiWorld Как выключить компьютер с любой версией Windows

скажите, а тот пример, который под катом (выше на этой же странице) вы смотрели?
а запускали?
Автор: qwedr
Дата сообщения: 25.08.2006 13:08
У меня дома есть рабочий пример под XP. Действительно команда на перезагрузку не работает без установки соответствующей привилегии. А как сделать - подумайте лучше сами, больше пользы будет. Я в свое время его сам с нуля написал юзая один дельфийский хелп (по WinAPI) и свои мозги.
Автор: kzsergo
Дата сообщения: 26.08.2006 18:20
Написал прогу, которая изменяет определенный ключ в реестре, который принадлежит нужной мне программы, но эти изменения вступают с силу только после перезагрузки этой программы. Можно ли как-нибудь сделать так, чтобы изменения вступали в силу сразу после изменения ключа?
Автор: SERGE_BLIZNUK
Дата сообщения: 26.08.2006 19:31
kzsergo

Цитата:
как-нибудь сделать так, чтобы изменения вступали в силу сразу после изменения ключа

Имхо, если вы не имеете возможность изменять исходники этой чужой программы - то нет ;-(
это ПОЛНОСТЬЮ зависит от того, по какому алгоритму эта программа работает с реестром, чаще всего, если речь идёт о чтении конфигурации - на запуске читается реестр и потом не обращается туда...
Автор: GTA3
Дата сообщения: 27.08.2006 21:33
есть такой вопросик по delphi

procedure xxx.runclick(sender: Tojbect);
var stS,stSS: string;

begin
stS:= 'Строка символов';
stSS:= stS;
stS := 'Это -' + stS;
stS[7]:= 'c'; // символы в строке нумеруются, начиная с 1
label.caption:= stS; // выводится Это- строка символов
end;

теперь вопрос зачем присваивать stSS:= stS; если вместо этой строки stS := 'Это -' + stS; мы могли написать такую stS := 'Это -' + stSS; перед эти определив что stSS:= 'Это-'
есть от такого кода какой нить выйгрыш перед моим...?

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Событие STFilter(DBGridEh) ???


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