Страница 7 из 12 ------------------------------------------------------------
Q-73: Delphi 5.0 and Win2K
------------------------------------------------------------ 1. Если кто не читает readme-файлы до начала установки, то с интересом узнает, что в сопроводиловке от Борланд указывается на проблему неправильной работы инсталлятора, если используются кнопки Browse для смены каталогов установки. При этом рекомендуется набрать/подредактировать пути вручную. (Не проверял, просто действовал как рекомендовано, хотя пути по умолчанию никогда не использую). 2. При установке с жесткого диска, весь дистрибутив вместе с папками Runimage и Install надо либо поместить в корень логического диска (что обычно неудобно), либо используя subst (или в сети - use net), сотворить букву для этого пути. Чтобы инсталлятор решил, что установка идет из корня диска. Иначе - облом-с. 3. При установке на машину, на которой предполагается наличие нескольких программеров, работающих посменно, сначала придется поставить из-под админа - для всех. А потом - из-под каждого аккаунта (хотя бы в режиме Registry + Custom). Иначе не будет компонентов на палитре. 4. Проверить переменные среды %TEMP% и %TMP%, рекомендуется короткий путь - C:\TEMP 5. Первичная установка под административным аккаунтом с АНГЛИЙСКИМ именем, например admin Vladimir Kladov <
Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script
> ----------------------------------- Можно экспоpтиpовать y админа HKEY_CURRENT_USER/Software/Borland и пpосто импоpтиpовать для каждого потом. Так несколько быстpее, чем инсталиpовать и уменьшается количество ошибок. Ruslan Fedoseev <
Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script
> ------------------------------------------------------------ Q-74: Почему в консольных приложениях неправильно отображаются русские буквы?
------------------------------------------------------------ Потому что кодировка шрифтов, используемых в редакторе Delphi - 1251 (ANSI), а в консольных приложениях - 866 (OEM). Чтобы добиться правильного отображения нужно использовать функцию CharToOEM (но при этом возрастёт размер кода), либо сразу писать проект в каком-либо консольном текстовом редакторе (Dos Navigator, Far) CharToOem('Привет',TmpStr); Writeln(TmpStr); Denis Filonov <
Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script
> ------------------------------------------------------------ Q-75: В чем pазличия ShellExecute и CreateProcess? ------------------------------------------------------------ ShellExecute может запустить приложение, ассоциированное с расширением файла, например: ShellExecute(Handle, 'open', 'mydoc.doc', nil, nil, SW_SHOW); запустит Word (или другое приложение, зарегистрованное для *.doc) и откроет файл mydoc. CreateProcess не обращает внимание на расширения, но возможности этой функции гораздо больше. Одна из главных - получение handles нового процесса и его первичного потока, с помощью которых можно запрашивать информацию о ходе дочернего процесса. Надо заметить, что хендл дочернего процесса может вернуть функция ShellExecuteEx, которая занимает, скажем, промежуточное положение. ------------------------------------------------------------
Q-76: Как внедрить dll в другое приложение?
------------------------------------------------------------ procedure QryName(threadID: DWord; Caller: HWND); external 'lib0.dll'; procedure TForm1.WMCopydata(var msg: TMessage); // message WM_COPYDATA; begin Caption := PChar(PCopyDataStruct(Pointer(msg.LParam)).lpData); end; procedure TForm1.Button1Click(Sender: TObject); var ahwnd: THandle; begin {Ищем по заголовку} ahwnd := FindWindow(nil, PChar(Edit1.Text)); if ahwnd <> 0 then QryName(GetWindowThreadProcessID(ahwnd, nil), Handle); end; --- lib0.dpr --- library lib0; uses Messages, Windows; function Answer( nCode: Integer; wprm: WParam; lprm: LParam): LResult; stdcall; type PMsg = ^TMsg; var buffer : array [0..MAX_PATH] of Char; cd : TCopyDataStruct; msg : PMsg; Caller : HWND; AHook: HHook; begin Result := 0; msg := PMsg(lprm); if (msg.Message = 0) and (msg.LParam <> 0) then begin AHook := msg.lParam; Caller := msg.wParam; cd.cbData := GetModuleFileName(0, buffer, SizeOf(buffer))+1; cd.lpData := @buffer; cd.dwData := GetCurrentThreadID; SendMessage(Caller, WM_COPYDATA, 0, LParam(@cd)); UnHookWindowsHookEx(AHook); PostThreadMessage(GetCurrentThreadID, 0, 0, 0); end; end; procedure QryName(tid: DWord; Caller: HWND); var AHook : Hhook; begin AHook := SetWindowsHookEx(WH_GETMESSAGE, Answer, Hinstance, tid); if AHook <> 0 then PostThreadMessage(tid, 0, Caller, AHook); end; exports QryName; begin end. |