Имеем, Delphi 2009, обработка сообщения WM_COPYDATA. Передача сообщения между 2 копиями запущенной программы, имеем 2 процедуры:
procedure SendCommandLine(Wnd:HWND);
var
CDS:TCopyDataStruct;
St:string;
begin
SetForegroundWindow(Wnd);
if ParamCount > 0 then
St := ParamStr(1)
else
St := '';
CDS.cbData := Length(St)*2 + 1;
CDS.lpData := PChar(St);
SendMessage(Wnd, WM_COPYDATA, 0, LParam(@CDS));
end;
и
procedure TfrmMain.WMCopyData(var Msg:TWMCopyData);
var
buf: array[0..MAX_PATH-1] of char;
begin
move(Msg.CopyDataStruct.lpData^, buf, length(buf)*sizeof(Char));
FilenameForOpening := Buf;
end;
Во второй процедуре получаем имя файла. Так вот, если помимо английских символов в имени файла есть русские, то в строку попадает мусор. Я так понимаю, что это связано с неверным определением длины строки, которая передается в сообщении.
Вопрос, как правильно определить и передать длину строки? Обратите внимание, Delphi 2009.
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
procedure TForm49.Button1Click(Sender: TObject);
begin
SendCommandLine(StrToInt(Edit1.Text), Edit2.Text);
end;
procedure TForm49.WMCopyData(var Msg: TWMCopyData);
var
S: {$IFDEF UNICODE}String{$ELSE}WideString{$ENDIF};
begin
// Есть хотя бы один символ и длина буфера чётна
if (Msg.CopyDataStruct^.cbData <= 2) or ((Msg.CopyDataStruct^.cbData and 1) = 1) then
S := ''
else
begin
SetLength(S, (Msg.CopyDataStruct^.cbData shr 1) - 1);
Move(Msg.CopyDataStruct.lpData^, Pointer(S)^, Msg.CopyDataStruct^.cbData);
end;
ShowMessage('Received string: "' + S + '"');
end;
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.