Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.10.2014, 00:27   #1
Terikon
Форумчанин
 
Регистрация: 22.02.2009
Сообщений: 174
Радость drag and drop файл в чужое окно

Делаю так, в консоль заноситься только первый символ из этого C:\Users\Admin\Desktop\notepad.exe пути, то есть только С

Подскажите где ошибка, или есть другие методы.

Код:
function MakeDrop(const FileNames: array of string): THandle;
var
  I, Size: Integer;
  Data: PDragInfoA;
  P: PAnsiChar;
begin
  Size := SizeOf(TDragInfoA) + 1;
  for I := 0 to High(FileNames) do
    Inc(Size, Length(FileNames[I]) + 1);
  Result := GlobalAlloc(GHND or GMEM_SHARE, Size);
  if Result <> 0 then
  begin
    Data := GlobalLock(Result);
    if Data <> nil then
      try
        Data.uSize := SizeOf(TDragInfoA);
        P := PAnsiChar(@Data.grfKeyState) + 4;
        Data.lpFileList := P;
        for I := 0 to High(FileNames) do
        begin
          Size := Length(FileNames[I]);
          Move(Pointer(FileNames[I])^, P^, Size);
          Inc(P, Size + 1);
        end;
      finally
        GlobalUnlock(Result);
      end
    else
    begin
      GlobalFree(Result);
      Result := 0;
    end;
  end;
end;

procedure TForm18.btn1Click(Sender: TObject);
var
  Wnd: hWnd;
  Drop: hDrop;
  dir, dfile: string;
begin
  dfile := 'C:\Users\Admin\Desktop\notepad.exe';
  Wnd := FindWindow('ConsoleWindowClass', nil);
  If (Wnd <> 0) then
  begin
    Drop := MakeDrop([dfile]);
    if Drop <> 0 then
      PostMessage(Wnd, wm_DropFiles, Drop, 0);
    GlobalFree(Drop);
  end
  else
  begin
    Exit;
  end;
end;

end.
Terikon вне форума Ответить с цитированием
Старый 03.10.2014, 01:23   #2
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,777
По умолчанию

Так зачем в современном Delphi использоать PDragInfoA? Переходи на TDragInfoW.
Vapaamies вне форума Ответить с цитированием
Старый 03.10.2014, 01:34   #3
Terikon
Форумчанин
 
Регистрация: 22.02.2009
Сообщений: 174
По умолчанию

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
Так зачем в современном Delphi использоать PDragInfoA? Переходи на TDragInfoW.
Заменил на TDragInfoW теперь ошибка вываливается на Data := GlobalLock(Result);
[DCC Error] Unit18.pas(46): E2010 Incompatible types: '_DRAGINFOW' and 'Pointer'
Terikon вне форума Ответить с цитированием
Старый 03.10.2014, 01:42   #4
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,777
По умолчанию

А головой подумать? Раз раньше указатель PDragInfoA использовался, его надо было на аналогичный W-указатель заменить.

И сразу предвосхищая вопрос, почему только половина пути передаваться будет: в вызове Move размер нужно на SizeOf(Char) умножать.
Vapaamies вне форума Ответить с цитированием
Старый 03.10.2014, 01:45   #5
Terikon
Форумчанин
 
Регистрация: 22.02.2009
Сообщений: 174
По умолчанию

я извиняюсь) я не особо силён в кодинге, этот исходник я нашел в сети, если вы действительно видите все ошибке могли бы внести изменения
Terikon вне форума Ответить с цитированием
Старый 03.10.2014, 09:07   #6
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Другие варианты чужого говнокода смотрел?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 03.10.2014, 13:46   #7
Terikon
Форумчанин
 
Регистрация: 22.02.2009
Сообщений: 174
По умолчанию

разобрался, оказывается всё очень просто, нужно просто заменить везде string на ansistring

Последний раз редактировалось Terikon; 03.10.2014 в 14:44.
Terikon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Drag And Drop Adyvan C# (си шарп) 0 04.03.2012 06:27
[?] Послать клавишу в чужое окно, не выводя окно на передний план. Moriarty Win Api 4 21.02.2011 05:11
drag and drop kelty Помощь студентам 0 11.09.2009 23:00
Drag and Drop nusik Общие вопросы C/C++ 2 09.07.2009 11:09
Нужна помощь (Drag-And-Drop & Drag-Abd-Dock)) Arkuz Общие вопросы Delphi 1 18.04.2009 00:15