76
Общий раздел / [CP] Как выделить память под untagged?
« : Октябрь 31, 2012, 10:15:55 am »
Никак не соображу. Вот есть у меня:
Через WinApi?
Я пробовал просто пустую строку присваивать:
Сделал так:
Вот на всякий случай тестовый код:
Код: [Выделить]
PtrWSTR* = POINTER TO ARRAY [untagged] OF CHAR;
...
name: WinApi.PtrWSTR;
Как под него правильно выделить память?Через WinApi?
Я пробовал просто пустую строку присваивать:
Код: [Выделить]
name := '';
Но потом у BB башню сносит, т.к. я этот name передаю в винапишную функцию, которая пишет строку по этому адресу... и видимо портит память.Сделал так:
Код: [Выделить]
name := ' ';
Проблема исчезла, но не пойму что делает BB в этом случае.Вот на всякий случай тестовый код:
Код: [Выделить]
MODULE SmartTest;
IMPORT Log := StdLog, WinApi, SYSTEM;
PROCEDURE Test1*;
VAR
res: WinApi.HWND;
format: INTEGER;
name: WinApi.PtrWSTR;
cchMaxCount: INTEGER;
i, j: INTEGER;
BEGIN Log.Clear;
cchMaxCount := 20;
res := WinApi.GetClipboardOwner();
Log.Int(res); Log.Ln;
IF WinApi.OpenClipboard(0) # 0 THEN
name := ' ';
Log.String("open"); Log.Ln;
format := 0;
REPEAT
format := WinApi.EnumClipboardFormats(format);
Log.Int(format);
CASE format OF
| WinApi.CF_TEXT:
Log.String(" -- CF_TEXT");
| WinApi.CF_BITMAP:
Log.String(" -- CF_BITMAP");
| WinApi.CF_METAFILEPICT:
Log.String(" -- CF_METAFILEPICT");
| WinApi.CF_SYLK:
Log.String(" -- CF_SYLK");
| WinApi.CF_DIF:
Log.String(" -- CF_DIF");
| WinApi.CF_TIFF:
Log.String(" -- CF_TIFF");
| WinApi.CF_OEMTEXT:
Log.String(" -- CF_OEMTEXT");
| WinApi.CF_DIB:
Log.String(" -- CF_DIB");
| WinApi.CF_PALETTE:
Log.String(" -- CF_PALETTE");
| WinApi.CF_PENDATA:
Log.String(" -- CF_PENDATA");
| WinApi.CF_RIFF:
Log.String(" -- CF_RIFF");
| WinApi.CF_WAVE:
Log.String(" -- CF_WAVE");
| WinApi.CF_UNICODETEXT:
Log.String(" -- CF_UNICODETEXT");
| WinApi.CF_ENHMETAFILE:
Log.String(" -- CF_ENHMETAFILE");
| WinApi.CF_HDROP:
Log.String(" -- CF_HDROP");
| WinApi.CF_LOCALE:
Log.String(" -- CF_LOCALE");
| WinApi.CF_MAX:
Log.String(" -- CF_MAX");
| WinApi.CF_OWNERDISPLAY:
Log.String(" -- CF_OWNERDISPLAY");
| WinApi.CF_DSPTEXT:
Log.String(" -- CF_DSPTEXT");
| WinApi.CF_DSPBITMAP:
Log.String(" -- CF_DSPBITMAP");
| WinApi.CF_DSPMETAFILEPICT:
Log.String(" -- CF_DSPMETAFILEPICT");
| WinApi.CF_DSPENHMETAFILE:
Log.String(" -- CF_DSPENHMETAFILE");
| WinApi.CF_PRIVATEFIRST:
Log.String(" -- CF_PRIVATEFIRST");
| WinApi.CF_PRIVATELAST:
Log.String(" -- CF_PRIVATELAST");
| WinApi.CF_GDIOBJFIRST:
Log.String(" -- CF_GDIOBJFIRST");
| WinApi.CF_GDIOBJLAST:
Log.String(" -- CF_GDIOBJLAS");
ELSE
i := WinApi.GetClipboardFormatNameW(format, name, cchMaxCount);
Log.String(" -- ");
IF i = 0 THEN
Log.String("UNKNOWN");
END;
j := 0;
WHILE i > 0 DO
Log.Char(name[j]);
INC(j);
DEC(i, 1);
END;
END;
Log.Ln;
UNTIL format = WinApi.ERROR_SUCCESS;
END;
IF WinApi.CloseClipboard() # 0 THEN
Log.String("close"); Log.Ln;
END;
END Test1;
BEGIN
END SmartTest.Test1