今書いた次の関数を使用して、文字列値をグローバルメモリハンドルに、またはその逆に変換したいと思います。
しかしStrToGlobalHandle()
、私のテストプログラムがハングする原因になります。したがってGlobalHandleToStr()
、まだテストできません。また、コードが論理的であるかどうかも疑問に思っています。
function StrToGlobalHandle(const aText: string): HGLOBAL;
var
ptr: PChar;
begin
Result := 0;
if aText <> '' then
begin
Result := GlobalAlloc(GMEM_MOVEABLE or GMEM_ZEROINIT, length(aText) + 1);
if Result <> 0 then
begin
ptr := GlobalLock(Result);
if Assigned(ptr) then
begin
StrCopy(ptr, PChar(aText));
GlobalUnlock(Result);
end
end;
end;
end;
function GlobalHandleToStr(const aHandle: HGLOBAL): string;
var
ptrSrc: PChar;
begin
ptrSrc := GlobalLock(aHandle);
if Assigned(ptrSrc) then
begin
SetLength(Result, Length(ptrSrc));
StrCopy(PChar(Result), ptrSrc);
GlobalUnlock(aHandle);
end
end;
テストコード:
procedure TForm3.Button1Click(Sender: TObject);
var
h: HGLOBAL;
s: string;
s2: string;
begin
s := 'this is a test string';
h := StrToGlobalHandle(s);
s2 := GlobalHandleToStr(h);
ShowMessage(s2);
GlobalFree(h);
end;
ところで、私はこれら2つの関数をヘルパーとして使用して、プログラム間で文字列値を送信したいと思います。プロセスAからプロセスBにグローバルハンドルを送信し、プロセスBはを使用して文字列を取得しますGlobalHandleToStr()
。ところで、私はWM_COPYや他のIPCメソッドを知っていますが、私の場合はこれらは適切ではありません。