//(c) romix, 2006

Library Hook_1C;
//Загрузчик сторонних библиотек в адресное пространство 1С
uses Windows, SysUtils;


///////////////////////////////////////////////////////////////
procedure LoadDlls;
var f: TextFile;
var fname: String;
var s: String;
var p: Integer;
var name, value: String;
var dir: String;
begin
  dir:=ExtractFilePath(ParamStr(0))+'Plugins\';
  fname:=dir+'Hook_1C.ini';

  //MessageBox(0, pchar(fname), 'ini', 0);

  if FileExists(fname)=False then Exit;
  //MessageBox(0, pchar(fname), 'Файл существует', 0);

  AssignFile(f, fname);
  Reset(f);
  Repeat
    Readln(f, s);
    p:=pos(';', s);
    if p>0 then s:=Copy(s,1,p-1); //отрезаем комментарий после ;
    p:=pos('=', s);
    if p=0 then Continue;
    name:=Copy(s,1, p-1); //имя в паре Имя=Значение
    name:=trim(name);
    value:=Copy(s, p+1, Length(s)-p+1); //значение
    value:=trim(value);

    //MessageBox(0, pchar(name), pchar(value), 0);

    if name='LoadDll' then begin
      if LoadLibrary(pchar(dir+value))=0 then begin
        MessageBox(0,pchar('Ошибка загрузки DLL: '+pchar(dir+value)), 'LoadDll', MB_ICONWARNING);
      end;

    end;

  Until Eof(f);
  CloseFile(f);

end;




function ShellExecute_orig(hWnd: HWND; Operation, FileName, Parameters,
  Directory: PChar; ShowCmd: Integer): HINST; stdcall; external 'SHELL32.dll' name 'ShellExecuteA';

//////////////////////////////////////////////////////////
Function ShellExecuteA(
//Эта функция "прозрачно" перехватывается только с целью присоединиться к процессу.
  hWnd: HWND;
  Operation,
  FileName,
  Parameters,
  Directory: PChar;
  ShowCmd: Integer): HINST;  export; stdcall;
begin
    //Вызываем оригинальную функцию ShellExecuteA
    Result:=ShellExecute_orig(hWnd, Operation, FileName, Parameters,  Directory, ShowCmd);
end;
exports ShellExecuteA;
//////////////////////////////////////////////////////////
begin
  //MessageBox(0, 'Start', 'md_chng', MB_ICONINFORMATION);
  LoadDlls();

end.
