Помогите, проблема при работе с библиотекой
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
-
- Посетитель
- Сообщения: 44
- Зарегистрирован: 27 Апрель 2010, 21:05
Помогите, проблема при работе с библиотекой
Есть библиотека написанная на Delphi, когда я обращаюсь из Clarion к функции, которая возвращает строку, то вылетает ошибка. Перадавать строку в библиотеку работает, а вот обратно нет. Исходник библиотеки Delphi у меня есть, если надо, то я там поправлю. Скажите, пожалуйста, что я не так делаю!
- Дед Пахом
- Старичок
- Сообщения: 3136
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 11 раз
- Поблагодарили: 31 раз
- Контактная информация:
Re: Помогите, проблема при работе с библиотекой
100% Вы неправильно обращаетесь из Clarion к функции Delphi!VladimirGT писал(а):Скажите, пожалуйста, что я не так делаю!
С уважением, ДП
-
- Посетитель
- Сообщения: 44
- Зарегистрирован: 27 Апрель 2010, 21:05
Re: Помогите, проблема при работе с библиотекой
Если можешь напиши пример. Может действительно, что-то не так делаю. Пожалуйста!!!
-
- Посетитель
- Сообщения: 44
- Зарегистрирован: 27 Апрель 2010, 21:05
- Дед Пахом
- Старичок
- Сообщения: 3136
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 11 раз
- Поблагодарили: 31 раз
- Контактная информация:
Re: Помогите, проблема при работе с библиотекой
Хорошо то, что хорошо кончается. Но всё-таки, задавая вопрос "что я не так делаю", покажите, что Вы делаете ваще-то? Декларацию функции, её вызов это по минимуму.
С уважением, ДП
- Admin
- Администратор
- Сообщения: 3962
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 27 раз
- Поблагодарили: 22 раза
- Контактная информация:
Re: Помогите, проблема при работе с библиотекой
Если в DelphiДед Пахом писал(а):Хорошо то, что хорошо кончается. Но всё-таки, задавая вопрос "что я не так делаю", покажите, что Вы делаете ваще-то? Декларацию функции, её вызов это по минимуму.
Код: Выделить всё
function GetLastDateTime():PChar;stdcall;
begin
GetLastDateTime := PChar(FormatDateTime('dd.mm.yy hh:nn:ss zzz',GlobalData^.MyDateTime));
end;
Код: Выделить всё
GetLastDateTime(),CSTRING,RAW,PASCAL,DLL(DLL_MODE)
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
-
- Посетитель
- Сообщения: 44
- Зарегистрирован: 27 Апрель 2010, 21:05
Re: Помогите, проблема при работе с библиотекой
Все правильно делал надо было только ShareMem добавить и все. Спасибо большое!!!
- Admin
- Администратор
- Сообщения: 3962
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 27 раз
- Поблагодарили: 22 раза
- Контактная информация:
Re: Помогите, проблема при работе с библиотекой
А подробнее можно, что и куда поставил. Не помню про такое. ShareMem!VladimirGT писал(а):Все правильно делал надо было только ShareMem добавить и все. Спасибо большое!!!
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
-
- Посетитель
- Сообщения: 44
- Зарегистрирован: 27 Апрель 2010, 21:05
Re: Помогите, проблема при работе с библиотекой
ShareMem - это модуль используемый в Delphi при передачи или возврата строки, иначе Delphi не корректно работает.
Например:
uses
ShareMem, Sysutils, Winsock, ... и т.д.
главное, что бы подключаемый модуль ShareMem был объявлен первым!
Например:
uses
ShareMem, Sysutils, Winsock, ... и т.д.
главное, что бы подключаемый модуль ShareMem был объявлен первым!
- Admin
- Администратор
- Сообщения: 3962
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 27 раз
- Поблагодарили: 22 раза
- Контактная информация:
Re: Помогите, проблема при работе с библиотекой
Все равно не понял для чего использовать ShareMem если и без него все работает прекрасно.VladimirGT писал(а):главное, что бы подключаемый модуль 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.
Код: Выделить всё
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
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
-
- Посетитель
- Сообщения: 44
- Зарегистрирован: 27 Апрель 2010, 21:05
Re: Помогите, проблема при работе с библиотекой
Дома последняя версия все в порядке работает , а на работе у меня Clarion 4.0 и из-за этого видимо и ошибку выдает, не знаю почему!
- Admin
- Администратор
- Сообщения: 3962
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 27 раз
- Поблагодарили: 22 раза
- Контактная информация:
Re: Помогите, проблема при работе с библиотекой
Я уже и забыл что это такое... у меня ощущение что Clarion начался с 5.0VladimirGT писал(а):Clarion 4.0 и из-за этого видимо и ошибку выдает
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса