OberonCore
https://forum.oberoncore.ru/

Проблемы с передачей параметров
https://forum.oberoncore.ru/viewtopic.php?f=2&t=178
Страница 1 из 1

Автор:  Grabli [ Понедельник, 24 Апрель, 2006 21:09 ]
Заголовок сообщения:  Проблемы с передачей параметров

Конечно строгая типизация в компонентном паскале дело хорошее. Но это головная боль для тех кто пользует WinApi функции.

Как передать параметр типа WinApi.PtrSTR в функцию WinApi.MessageBoxA?


Например:

Код:
MODULE Test;
IMPORT WinApi, SYSTEM;

VAR Msg: ARRAY 255 OF CHAR;
        Res: INTEGER;

BEGIN
 Msg:="Иди работай";
 Res:=WinApi.MessgaeBoxA(HWnd, Msg, "Сообщение" , {4,5});
END Test.


На такое компилятор ругнется. Типы не соответствуют. Если вместо Msg передать указатель, SYSTEM.ADR(Msg):
Res:=WinApi.MessgaeBoxA(HWnd, SYSTEM.ADR(Msg), "Сообщение" , {4,5});

То тоже ругается.

Если Msg перевести к типу WinApi.PtrSTR с помощью SYSTEM.VAL(WinApi.PtrSTR, Msg):
Res:=WinApi.MessgaeBoxA(HWnd, SYSTEM.VAL(WinApi.PtrSTR, Msg), "Сообщение" , {4,5});
То проглотит. Но при запуске выведет ошибку...

Как поуму передавать в функции WinApi параметры?

Автор:  Илья Ермаков [ Понедельник, 24 Апрель, 2006 21:13 ]
Заголовок сообщения: 

Не забывайте, что в КП CHAR двубайтовый, юникодовский. Поменяйте в вышеприведенном примере ARRAY OF CHAR на ARRAY OF SHORTCHAR - и все заработает.

Автор:  Grabli [ Вторник, 25 Апрель, 2006 07:56 ]
Заголовок сообщения: 

Однако, с таким типом Msg: ARRAY 255 OF SHORTCHAR;

Log.String(Msg) отказывается работать.

----------------------------------
И ещё. Что лучше сделать, что бы во всей программе использовались одинаковые типы?
Создать один модуль, например, Types, где собрать все пользовательские типы. И в каждом модуле импортировать только их, что бы была совместимость.

Или TYPE MyType = ARRAY 20 OF INTEGER; в модуле1
Будет ли он соответствовать:
TYPE MyType = ARRAY 20 OF INTEGER; в модуле2

Автор:  Илья Ермаков [ Вторник, 25 Апрель, 2006 09:38 ]
Заголовок сообщения: 

Да нет, отдельный модуль выделять незачем. Каждый модуль объявляет те типы, которые его касаются.

Цитата:
Однако, с таким типом Msg: ARRAY 255 OF SHORTCHAR;
Log.String(Msg) отказывается работать.

Log.String(LONG(Msg)).
А вообще-то не используйте SHORTCHAR нигде, кроме модулей, которые работают с системой. Приводите обычный CHAR: SHORT(CHAR), или, если в строке используются русские символы, MtStrings.Short.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/