Проблема с передачей строки работающему приложению

Тема в разделе "Delphi - Система", создана пользователем NightmareTerrible, 13 июл 2011.

  1. NightmareTerrible

    NightmareTerrible Гость

    Здравствуйте, уважаемые дельфисты.
    У меня возникла следующая проблема.

    Есть приложение, которое можно запускать только в одном экземпляре, однако необходимо поддерживать возможность открытия ассоциированных файлов. Для решения этой задачи использую TCopyDataStruct следующим образом.

    Приложение при запуске проверяет, не запущена ли уже его копия, и если да, то передаёт ему параметры командной строки.
    Код (Delphi):
    if ParamCount <> 0 then
    begin
    try
    cd.cbData := Length(ParamStr(1));
    cd.lpData := PChar(ParamStr(1));
    cd.dwData := 0;
    WParam := Application.Handle;
    LParam := Integer(@cd);
    SendMessage(OriChemesWindow, WM_COPYDATA, WParam, LParam);
    finally
    end;
    end;
    В переменной OriChemesWindow хранится дескриптор окна открытого ранее приложения (первой копии). Также существует обработчик этого сообщения:

    Код (Delphi):
    procedure TOriChemesForm.WMCopyData(var Msg: TWMCopyData);
    var
    cd:TCopyDataStruct;
    FileName : string;
    i,len : integer;
    begin
    // Открываем файл, переданный в качетсве параметра (при открытии второй копии приложения)
    cd := Msg.CopyDataStruct^;
    FileName := '';
    len := cd.cbData;
    for i := 0 to len - 1 do
    FileName := Filename + (PChar(cd.lpData) + i)^;
    if FileExists(FileName) then begin
    FileOpen1.Dialog.FileName := FileName;
    FileOpen1Accept(nil);
    end;
    inherited;
    end;
    Процедура описана как
    Код (Delphi):
    procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
    Вроде бы всё должно работать хорошо, но вот проблема: при передаче параметров происходит какая-то ошибка, и часть текста преобразуется в крякозябры, например, во второй копии это был файл D:\Chemes\ver1.4\111temp.ori , а при получении параметров в первой копии получается что-то в роде D:\Chemeﲧ酋癔醀癔＀
    Помогите, пожалуйста, решить эту проблемку. Использую Delphi 2010.
     
  2. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Юникод батенька... :)
    1.1. String в Delphi 7 = AnsiString
    1.2. String в Delphi 2010 = WideString

    2.1. PChar в Delphi 7 = PAnsiChar
    2.2. PChar в Delphi 2010 = PWideChar

    3. Функция ParamStr возвращает AnsiString, следовательно
    Код (Delphi):
    PWideChar(ParamStr(1)) = лабуда... :-)
    нужно как минимум
    Код (Delphi):
    cd.lpData := PAnsiChar(ParamStr(1));
    4.
    С кодом прямо скажем Вы пожадничали выложить... но если это локально (внутри процедуры) память выделяется, то на мой взгляд это совсем не гуд...
    Надо
    Код (Delphi):
    var
    param: AnsiString = ''; // глобальная!!!! переменная

    //...
    param := ParamStr(1);

    cd.cbData := Length(param);
    cd.lpData := PAnsiChar(param);
    5. И вот это
    Код (Delphi):
     FileName := '';
    len := cd.cbData;
    for i := 0 to len - 1 do
    FileName := Filename + (PChar(cd.lpData) + i)^;
    я бы поменял на вот это:
    Код (Delphi):
    var
    FileName: AnsiString;
    cd:TCopyDataStruct;
    len: Integer;
    begin

    FileName := '';
    len := cd.cbData;
    SetLength(FileName,len);
    CopyMemory(PAnsiChar(FileName),cd.lpData,len);
    //...
    А может и проще еще
    Код (Delphi):
     FileName := StrPas(PAnsiChar(cd.lpData));
     
  3. NightmareTerrible

    NightmareTerrible Гость

    sinkopa
    Огромное спасибо, помогло. О том, что в 2010-м строки стали уникодовскими я знал, но видимо не хватило опыта (или сообразительности). Без вашей помощи маялся бы ещё очень долго. Кстати, через StrPas не прокатило; возможно потому, что функция преобразует к строкам паскаля.
     
Загрузка...
Похожие Темы - Проблема передачей строки
  1. lemuriez
    Ответов:
    25
    Просмотров:
    4.070
  2. c0de3r
    Ответов:
    5
    Просмотров:
    119
  3. DobermannTT
    Ответов:
    10
    Просмотров:
    134
  4. SoulPaladin
    Ответов:
    4
    Просмотров:
    128
  5. Artael
    Ответов:
    1
    Просмотров:
    109

Поделиться этой страницей