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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема передачи записи через буфер, Свой формат в буфере обмена 
:(
    Опции темы
Khim
Дата 5.9.2011, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброго времени суток!

Запутался. aReserv: String [255]; - пересылаю и получаю фиксированную длину строки. Хотелось бы aReserv: Pointer; aReserv := PChar ('Проверка') пересылается и получается норм. А вот, например:
  GetWindowText (Wnd, A, Max_Path);
  aReserv := PChar (@A); выдает ошибку.
как мне переслать данные не фиксированной длины?

Заранее спасибо.


Код

unit USendMsg;

interface

Uses
  Windows, Forms, Messages, Clipbrd;


Type
  PRecData = ^TRecData;
  tagRecData = Packed Record
    aFromDll: Boolean; 
    aHandle: LongWord; 
    aMsg: DWord; 
    aReserv: String [255]; 
End;
  TRecData = tagRecData;
  RecData = tagRecdata;


  TMsgForApp = Class
    Procedure CreateForApp;
    Function Hook (Var Msg: TMessage): Boolean;
End;

Var
  WM_RegMsg: PChar;
  DDGData: PChar; 
  CF_DDGDATA: Cardinal; 

  BackReciveProc: Procedure (Msg: DWord; Reserv: String) of object = Nil;
  Procedure SendMsg (Msg: DWord; Const Reserv: String); OverLoad;
  Procedure SendMsg (Const TRD: TRecData); OverLoad; 

implementation

Var
  TMFA: TMsgForApp;
  WM_Msg: DWord;

procedure SendMsg(Msg: DWord; Const Reserv: String);
var
  TRD: TRecdata;
begin
  With TRD Do
  Begin
    aFromDll := Application.MainForm = Nil;
    If aFromDll Then
      aHandle := hInstance
     Else
      aHandle := Application.MainForm.Handle;
    aMsg := Msg;
    aReserv := Reserv;
  End;
  SendMsg (TRD);
end;

Procedure SendMsg (Const TRD: TRecData); 
var
  Hand: THandle;
  DataPtr: Pointer;
Begin
  Hand := GlobalAlloc(GMEM_MOVEABLE, SizeOf(TRecData)); 
  try
    DataPtr := GlobalLock(Hand); 
    try
      Move(TRD, DataPtr^, SizeOf (TRD));
      ClipBoard.Open; 
      try
        ClipBoard.SetAsHandle(CF_DDGDATA, Hand);
      finally
        Clipboard.Close
      end;
    finally
      GlobalUnlock(Hand);
    end;
  except
    GlobalFree(Hand);
    raise;
  end;
  SendMessage (HWnd_BroadCast, WM_MSG, 0, 0);
end;

{ TMsgForApp }

procedure TMsgForApp.CreateForApp;
begin
  Application.HookMainWindow(Hook);
end;

function TMsgForApp.Hook(var Msg: TMessage): Boolean;
var
  Data: THandle;
  DataPtr: Pointer;
  Size: Integer;
  TRD: TRecData;
begin
  Result := False;
  If @BackReciveProc <> Nil Then
  If MSG.Msg = WM_MSG Then
  Begin
    Data := ClipBoard.GetAsHandle(CF_DDGDATA);
    if Data = 0 then
      Exit;
    DataPtr := GlobalLock(Data);
    if SizeOf(TRecData) > GlobalSize(Data) then
      Size := GlobalSize(Data)
    else
      Size := SizeOf(TRecData);
    Move(DataPtr^, TRD, Size);

    IF TRD.aFromDll And (TRD.aHandle = hInstance) Or
      (Not TRD.aFromDll) And (TRD.aHandle = Application.MainForm.Handle) Then
    Begin
      GlobalUnlock (Data);
      Exit;
    End;
{    ShowMessage (IntToStr (TRD.aHandle));
    ShowMessage (IntToStr (TRD.aMsg));
    ShowMessage (PChar (TRD.aReserv));}
    BackReciveProc (TRD.aMsg, TRD.aReserv);
    GlobalUnlock(Data);
  End;
end;

Initialization

  If WM_RegMsg = '' Then
    WM_RegMsg := 'WM_ExMsg';
  WM_MSG := RegisterWindowMessage (WM_RegMsg);
  If DDGData = '' Then
    DDGData := 'CF_ExData';
  CF_DDGDATA := RegisterClipBoardFormat(DDGData);

  TMFA.CreateForApp;

end.

PM MAIL   Вверх
alexnef
Дата 7.9.2011, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



GetWindowText (Wnd, A, Max_Path);

Если А:PChar то конструкция aReserv := PChar (@A) получает указатель на указатель. Попробуй заменить на 
aReserv := PChar(A) 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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