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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.08.2011, 23:08   #1
s1s1s1
Пользователь
 
Регистрация: 28.09.2009
Сообщений: 63
По умолчанию CopyData

почему добавляется абракадабра
E:\SOUND\12STON~1\12STON~1\12STON~2 .MP3
dpr
Код:
var
wnd: HWND;
  copyDataStruct: TCopyDataStruct;
  ParamString: string;
  WParam, LParam: integer;
  i: Integer;
 begin
 wnd:= FindWindow('Tfm',nil);
 Application.Initialize;
  Application.CreateForm(Tfm, fm);Application.Run;
ParamString := '';
    for i := 1 to ParamCount do begin
      if i > 0 then
      ParamString := ParamString + ' ' + ParamStr(i)
      else
      ParamString:= ParamStr(i);
CopyDataStruct.lpData := PChar(ParamString);
CopyDataStruct.cbData := Length(ParamString);
    CopyDataStruct.dwData := 0;
    WParam := Application.Handle;
    LParam := Integer(@CopyDataStruct);
    SendMessage(wnd, WM_CopyData, WParam, LParam);
    Application.Terminate;
  end;
unit
Код:
 procedure Tfm.CopyData(var Msg: TWMCopyData);
  var
  ParamStr: string;
  CopyDataStructure: TCopyDataStruct;
  sText: array[0..255] of Char;
begin
StrLCopy(sText, Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData);
listbox1.Items.Add(sText);
s1s1s1 вне форума Ответить с цитированием
Старый 09.08.2011, 06:55   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
почему добавляется абракадабра
E:\SOUND\12STON~1\12STON~1\12STON~2 .MP3
Где вы увидели абракадабру? Это обычные короткие пути.
p51x вне форума Ответить с цитированием
Старый 09.08.2011, 09:49   #3
s1s1s1
Пользователь
 
Регистрация: 28.09.2009
Сообщений: 63
По умолчанию

подскажите пожалуйста как получать полные пути к файлам
s1s1s1 вне форума Ответить с цитированием
Старый 09.08.2011, 10:19   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

по поиску за 5 секунд найдено..

вот, например, из DelphiWorld пример
Код:
{==============================================} 
Function LongFileName(ShortName: String): String; 
{==============================================} 
Var 
  SR: TSearchRec; 

Begin 
  Result := ''; 
  If (pos ('\\', ShortName) + pos ('*', ShortName) + 
      pos ('?', ShortName) <> 0) Or Not FileExists(ShortName) Then 
  Begin 
    { ignore NetBIOS name, joker chars and invalid file names } 
    Exit; 
  End; 
  While FindFirst(ShortName, faAnyFile, SR) = 0 Do 
  Begin 
    { next part as prefix } 
    Result := '\' + SR.Name + Result; 
    SysUtils.FindClose(SR);  { the SysUtils, not the WinProcs procedure! } 
    { directory up (cut before '\') } 
    ShortName := ExtractFileDir (ShortName); 
    If length (ShortName) <= 2 Then 
    Begin 
      Break;  { ShortName contains drive letter followed by ':' } 
    End; 
  End; 
  Result := ExtractFileDrive (ShortName) + Result; 
end;
или вот примерно то же самое ТУТ, из FIDO конференции RU.DELPHI.CHAINIK...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.08.2011, 23:42   #5
s1s1s1
Пользователь
 
Регистрация: 28.09.2009
Сообщений: 63
По умолчанию

как пользоваться функцией?
s1s1s1 вне форума Ответить с цитированием
Старый 10.08.2011, 08:35   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

????

Код:
var
    sShortName, 
    SFullFileName : string;
  ....
begin
  ....
  // получение короткого имени
  sShortName := 'E:\SOUND\12STON~1\12STON~1\12STON~2 .MP3';
  ....
   // преобразование короткого имени файла в полное (длинное)
  SFullFileName := LongFileName(sShortName);
...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.08.2011, 09:43   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Изобретаем очередной велосипед или просто опять забиваем на документацию?

http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
p51x вне форума Ответить с цитированием
Старый 10.08.2011, 11:37   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Изобретаем очередной велосипед или просто опять забиваем на документацию?
1) ну, не без того...
а почему бы не изобрести велосипед, если надо "ехать", а на чём - не знаешь..

2) вариант с FindFirst будет работать корректно под любой Windows (в том числе и Windows 95/98). Не думаю, что сейчас это актуально, но предложенный выше выриант явно из тех времён, когда это было актуально и важно (предложенный Вами вариант через GetLongPathName требует Widows версии не ниже XP)

3) "Вам хочется песен? их есть у меня!"
вот вариант через использования функции KERNEL32 (ветка с работой на других версиях Windows безжалостно вырвана с корнем...)
Код:
  function ToLongPath(AFileName: PChar): String;
  var
    Handle : Integer;
    iSize  : Integer;
    GetLongPathName: function (ShortPathName: PChar; LongPathName: PChar;
      cchBuffer: Integer): Integer stdcall;
  begin
    Result := AFileName;
    Handle := GetModuleHandle('KERNEL32');
    if Handle <> 0 then
    begin
      @GetLongPathName := GetProcAddress(Handle, 'GetLongPathNameA');
      if Assigned(GetLongPathName) then begin
            SetLength(Result, MAX_PATH+1);
            iSize := GetLongPathName(AFileName, PChar(Result), MAX_PATH+1);
            if (iSize > 0) then
               SetLength(Result, iSize)
            else
               Result := '#error: not file found#'
            end;
      end
      else Result := '#Error: API function not loaded#';
    end;

procedure TForm1.Button1Click(Sender: TObject);
var pshort : pchar;
begin
//  pshort := PChar(Edit1.Text);
  pshort := 'C:\PROGRA~1\MI1933~1\OFFICE12\DOCUME~1\1049\buildi~1.dot';
  Edit2.Text :=  ToLongPath( pshort );
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.08.2011, 10:11   #9
s1s1s1
Пользователь
 
Регистрация: 28.09.2009
Сообщений: 63
По умолчанию

Код:
Function LongFileName(ShortName: String): String;
Код:
var
    sShortName,
    SFullFileName : string;
begin  
  sShortName := 'E:\SOUND\12STON~1\12STON~1\12STON~2 .MP3'; 
  SFullFileName := LongFileName(sShortName);
  listbox1.Items.Add(SFullFileName);
добавляется пустая строка
Код:
 function ToLongPath(AFileName: PChar): String;
любой файл выдает
#error: not file found#
в чем может быть дело?
s1s1s1 вне форума Ответить с цитированием
Старый 11.08.2011, 10:29   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1-е.
пробелов в коротком имени БЫТЬ НЕ МОЖЕТ!!

откуда у Вас после 12STON~2 пробел ?!
Цитата:
Код:
'E:\SOUND\12STON~1\12STON~1\12STON~2 .MP3';
2-е.
короткое имя может быть развёрнуто ТОЛЬКО в том случае, если такой файл (с таким коротким именем существует).
Проверить существование очень просто.
наберите в командной строке
Код:
dir C:\PROGRA~1\COMMON~1\MICROS~1\OFFICE12\OFFICE~1\osetup.dll
если dir выдаст информацию о файле, значит файл есть и короткое имя верное.
если же выдаст "Файл не найден." - значит имя неверное (файла такого нет).


p.s. может Вам уже проще сделать маленький тестовый проект, выложить его исходинки и получить работающий вариант?!...
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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