Помогите, проблема при работе с библиотекой

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
VladimirGT
Посетитель
Сообщения: 44
Зарегистрирован: 27 Апрель 2010, 21:05

Помогите, проблема при работе с библиотекой

Сообщение VladimirGT »

Есть библиотека написанная на Delphi, когда я обращаюсь из Clarion к функции, которая возвращает строку, то вылетает ошибка. Перадавать строку в библиотеку работает, а вот обратно нет. Исходник библиотеки Delphi у меня есть, если надо, то я там поправлю. Скажите, пожалуйста, что я не так делаю!
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3136
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 11 раз
Поблагодарили: 31 раз
Контактная информация:

Re: Помогите, проблема при работе с библиотекой

Сообщение Дед Пахом »

VladimirGT писал(а):Скажите, пожалуйста, что я не так делаю!
100% Вы неправильно обращаетесь из Clarion к функции Delphi! :D
С уважением, ДП
VladimirGT
Посетитель
Сообщения: 44
Зарегистрирован: 27 Апрель 2010, 21:05

Re: Помогите, проблема при работе с библиотекой

Сообщение VladimirGT »

Если можешь напиши пример. Может действительно, что-то не так делаю. Пожалуйста!!!
VladimirGT
Посетитель
Сообщения: 44
Зарегистрирован: 27 Апрель 2010, 21:05

Re: Помогите, проблема при работе с библиотекой

Сообщение VladimirGT »

Все понял, дошло! Всем спасибо!!!
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3136
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 11 раз
Поблагодарили: 31 раз
Контактная информация:

Re: Помогите, проблема при работе с библиотекой

Сообщение Дед Пахом »

Хорошо то, что хорошо кончается. Но всё-таки, задавая вопрос "что я не так делаю", покажите, что Вы делаете ваще-то? Декларацию функции, её вызов это по минимуму.
С уважением, ДП
Аватара пользователя
Admin
Администратор
Сообщения: 3962
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 27 раз
Поблагодарили: 22 раза
Контактная информация:

Re: Помогите, проблема при работе с библиотекой

Сообщение Admin »

Дед Пахом писал(а):Хорошо то, что хорошо кончается. Но всё-таки, задавая вопрос "что я не так делаю", покажите, что Вы делаете ваще-то? Декларацию функции, её вызов это по минимуму.
Если в Delphi

Код: Выделить всё

function GetLastDateTime():PChar;stdcall;
begin
  GetLastDateTime := PChar(FormatDateTime('dd.mm.yy hh:nn:ss zzz',GlobalData^.MyDateTime));
end;
В Clarion описываем как

Код: Выделить всё

GetLastDateTime(),CSTRING,RAW,PASCAL,DLL(DLL_MODE)
У меня так все работает.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
VladimirGT
Посетитель
Сообщения: 44
Зарегистрирован: 27 Апрель 2010, 21:05

Re: Помогите, проблема при работе с библиотекой

Сообщение VladimirGT »

Все правильно делал надо было только ShareMem добавить и все. Спасибо большое!!!
Аватара пользователя
Admin
Администратор
Сообщения: 3962
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 27 раз
Поблагодарили: 22 раза
Контактная информация:

Re: Помогите, проблема при работе с библиотекой

Сообщение Admin »

VladimirGT писал(а):Все правильно делал надо было только ShareMem добавить и все. Спасибо большое!!!
А подробнее можно, что и куда поставил. Не помню про такое. ShareMem!
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
VladimirGT
Посетитель
Сообщения: 44
Зарегистрирован: 27 Апрель 2010, 21:05

Re: Помогите, проблема при работе с библиотекой

Сообщение VladimirGT »

ShareMem - это модуль используемый в Delphi при передачи или возврата строки, иначе Delphi не корректно работает.
Например:
uses
ShareMem, Sysutils, Winsock, ... и т.д.

главное, что бы подключаемый модуль ShareMem был объявлен первым!
Аватара пользователя
Admin
Администратор
Сообщения: 3962
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 27 раз
Поблагодарили: 22 раза
Контактная информация:

Re: Помогите, проблема при работе с библиотекой

Сообщение Admin »

VladimirGT писал(а):главное, что бы подключаемый модуль ShareMem был объявлен первым!
Все равно не понял для чего использовать ShareMem если и без него все работает прекрасно.
Что то я не догоняю. Всегда DLL на дельфи делал без этого.

Код: Выделить всё

library xHook;

uses
  SysUtils,
  Windows,
  Messages;

const
  MMFName: PChar = 'xHook'; // имя объекта файлового отображения

{структура, поля которой будут отображены в файл подкачки}
type
  PGlobalDLLData = ^TGlobalDLLData;
  TGlobalDLLData = packed record
    KeyHook      : HWND;      // дескриптор установленной ловушки для клавиатуры
    MouseHook    : HWND;      // дескриптор установленной ловушки для мышки
    MyAppWnd     : HWND;      // дескриптор нашего приложения
    MyDateTime   : TDateTime; // дата и время последнего события
    DebugInfo    : LongInt;   // DebugInfo
    ModuleHandle : HWND;
  end;

var
  GlobalData   : PGlobalDLLData;
  MMFHandle    : THandle;
  WM_MYKEYHOOK : Cardinal;

function GetLastDateTime():PChar;stdcall;
begin
  GetLastDateTime := PChar(FormatDateTime('dd.mm.yy hh:nn:ss zzz',GlobalData^.MyDateTime));
end;

function GetDebugInfo():longint;stdcall;
begin
  GetDebugInfo := GlobalData^.DebugInfo;
end;

function KeyboardProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
var
  AppWnd: HWND;  // дескриптор приложения, в котором произошло нажатие клавишы
  ModuleHandle: HWND;
begin
  if code < 0 then
  begin
    Result:= CallNextHookEx(GlobalData^.KeyHook, Code, wParam, lParam);
    Exit;
  end;
  AppWnd  := GetForegroundWindow();
  ModuleHandle := GetModuleHandle('');
//  GlobalData^.MyParam
  GlobalData^.DebugInfo := LongInt(ModuleHandle);
  if ((GlobalData^.ModuleHandle = ModuleHandle) and (int(GlobalData^.ModuleHandle) > 0)) or (int(GlobalData^.ModuleHandle) = 0) then
  begin
    GlobalData^.MyDateTime := Now;
    SendMessage(GlobalData^.MyAppWnd, WM_MYKEYHOOK, wParam, AppWnd);
  end;
  CallNextHookEx(GlobalData^.KeyHook, Code, wParam, lParam);
  Result:= 0;
end;

function MouseProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
var
  AppWnd: HWND;  // дескриптор приложения, в котором произошло нажатие клавишы
  Hour1, Min1, Sec1, MSec1: Word;
  Hour2, Min2, Sec2, MSec2: Word;
  ModuleHandle: HWND;
begin
  if code < 0 then
  begin
    Result:= CallNextHookEx(GlobalData^.MouseHook, Code, wParam, lParam);
    Exit;
  end;
  DecodeTime(GlobalData^.MyDateTime,Hour1,Min1,Sec1,MSec1);
  DecodeTime(Now,Hour2,Min2,Sec2,MSec2);
  if (Hour1=Hour2) and (Min1=Min2) and (Sec2-Sec1 > 1) then
  begin
  end;
  AppWnd  := GetForegroundWindow();
  ModuleHandle := GetModuleHandle(PChar('xhook.dll'));
  GlobalData^.DebugInfo := LongInt(ModuleHandle);
  if ((GlobalData^.ModuleHandle = ModuleHandle) and (int(GlobalData^.ModuleHandle) > 0)) or (int(GlobalData^.ModuleHandle) = 0) then
  begin
    GlobalData^.MyDateTime := Now;
    SendMessage(GlobalData^.MyAppWnd, WM_MYKEYHOOK, wParam, AppWnd);
  end;
  CallNextHookEx(GlobalData^.MouseHook, Code, wParam, lParam);
  Result:= 0;
end;

procedure OpenGlobalData();
begin
  {регестрируем свой тип сообщения в системе}
  WM_MYKEYHOOK:= RegisterWindowMessage('WM_MYKEYHOOK');
  {получаем объект файлового отображения}
  MMFHandle:= CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName);
  if MMFHandle = 0 then
    begin
//      MessageBox(0, 'Can''t create FileMapping', 'Message from keyhook.dll', 0);
      Exit;
    end;
  {отображаем глобальные данные на АП вызывающего процесса и получаем указатель
  на начало выделенного пространства}
  GlobalData:= MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalDLLData));
  if GlobalData = nil then
    begin
      CloseHandle(MMFHandle);
//      MessageBox(0, 'Can''t make MapViewOfFile', 'Message from keyhook.dll', 0);
      Exit;
    end;
end;

function Hook(switch : Boolean; ModuleHandle : HWND; hMainProg: HWND):integer; export; stdcall;
begin
//  OpenGlobalData;
  if switch=true then
  begin
    GlobalData^.KeyHook   := SetWindowsHookEx(WH_KEYBOARD, @KeyboardProc, HInstance, 0);
    GlobalData^.MouseHook := SetWindowsHookEx(WH_MOUSE, @MouseProc, HInstance, 0);
    GlobalData^.MyAppWnd  := hMainProg;
    GlobalData^.ModuleHandle  := ModuleHandle;
    if (GlobalData^.KeyHook <> 0) and (GlobalData^.MouseHook <> 0) then
    begin
//      MessageBox(0, 'Хуки установлены !', 'Message from keyhook.dll', 0);
      Hook := 0;
    end
    else
    begin
//      MessageBox(0, 'Хуки установить не удалось !', 'Message from keyhook.dll', 0);
      Hook := 1;
    end;
  end
  else
  begin
    {Удаляю функцию-фильтр, если она установлена (т.е. switch=false). }
    if UnhookWindowsHookEx(GlobalData^.KeyHook) and UnhookWindowsHookEx(GlobalData^.MouseHook) then
    begin
//      MessageBox(0, 'Хуки сняты !', 'Message from keyhook.dll', 0);
      Hook := 0;
    end
    else
    begin
//      MessageBox(0, 'Хуки снять не удалось !', 'Message from keyhook.dll', 0);
      Hook := 2;
    end;
  end;
end;

procedure CloseGlobalData();
begin
  UnmapViewOfFile(GlobalData);
  CloseHandle(MMFHandle);
end;

exports Hook                 index 1;
exports GetLastDateTime      index 2;
exports GetDebugInfo         index 3;

begin
  OpenGlobalData;
end.
Вот с этой DLL общаюсь через

Код: Выделить всё

     MODULE('xhook.dll')
       Hook(BYTE Mode, BYTE IMode, LONG HWnd),LONG,PROC,RAW,PASCAL,DLL(DLL_MODE)
       GetLastDateTime(),CSTRING,RAW,PASCAL,DLL(DLL_MODE)
     END
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
VladimirGT
Посетитель
Сообщения: 44
Зарегистрирован: 27 Апрель 2010, 21:05

Re: Помогите, проблема при работе с библиотекой

Сообщение VladimirGT »

Дома последняя версия все в порядке работает :D , а на работе у меня Clarion 4.0 и из-за этого видимо и ошибку выдает, не знаю почему!
Аватара пользователя
Admin
Администратор
Сообщения: 3962
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 27 раз
Поблагодарили: 22 раза
Контактная информация:

Re: Помогите, проблема при работе с библиотекой

Сообщение Admin »

VladimirGT писал(а):Clarion 4.0 и из-за этого видимо и ошибку выдает
Я уже и забыл что это такое... у меня ощущение что Clarion начался с 5.0 :twisted:
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Ответить