Borland Delphi FAQ
Страница 7.


------------------------------------------------------------

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.

 
« Предыдущая статья   Следующая статья »