Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Портирование на Pascal с VB

56K
25 марта 2010 года
zCHIP
8 / / 21.03.2010
Всем привет.
Возникло затруднение в понимании как работает в этом VB ByRef и ByVal. Перевожу на Delphi один проект, в нем используется dll-ка, из которой вызываются функции, например:

 
Код:
//оригинал VBA
//Declare Function DrvGetCapStatus Lib "drv.dll" _
//(ByVal hWnd As Long, ByRefCaptured As Long) As Integer

function DrvGetCapStatus(hWnd: Int64; Captured: Int64 (как правильно оформить указатель? ): integer; stdcall; external 'drv.dll';
6
25 марта 2010 года
George
4.1K / / 05.01.2007
 
Код:
function DrvGetCapStatus(hWnd: Int64; var Captured: Int64): integer; stdcall; external 'drv.dll';
56K
25 марта 2010 года
zCHIP
8 / / 21.03.2010
т.е. разницы нет по сути между ByVal и ByRef?
303
25 марта 2010 года
makbeth
1.0K / / 25.11.2004
Еще как есть. [SIZE=1][COLOR=Silver]Кстати, George ошибся. Должно быть наоборот:[/COLOR][/SIZE] ByVal - это ссылка по значению, т.е. значение параметра равно значению фактического параметра и является его копией (в Delphi описывается как простой параметр), ByRef - ссылочное значение, т.е. фактически указатель на переменную, содержащую фактическое значение параметра. Если значение по ссылке будет изменено внутри функции, то оно будет изменено и в переменной внешнего контекста (в Delphi описывается с ключевым словом var или const).
56K
25 марта 2010 года
zCHIP
8 / / 21.03.2010
Ух, голову сломать можно с этими VB дебрями, уже пару часов втыкаю. Значит в итоге правильно будет так:

 
Код:
function DrvGetCapStatus(hWnd: Int64; var Captured: Int64): integer; stdcall; external 'drv.dll';
253
25 марта 2010 года
Proger_XP
1.5K / / 07.08.2004
Цитата: makbeth
(в Delphi описывается с ключевым словом var или const).


Или out. Проще говоря, эти эти определения одинаковы:

 
Код:
procedure Proc(const AVar: String);
procedure Proc(var AVar: String);
procedure Proc(out AVar: String);
procedure Proc(AVar: PString);

Более того, у них одинаковые параметры в том смысле, что Delphi генерирует одинаковый код для "var"/... - этот тот же указатель. Единственная разница в том, что программисту так обычно удобнее писать код процедуры - не надо везде дописывать "AVar^", меньше вариантов для ошибки.

Кстати, многие портированные импорты WinAPI пользуются этим, и заменяют Pointer'ы на "var".
56K
25 марта 2010 года
zCHIP
8 / / 21.03.2010
Proger_XP, снова спасибо ) Проще объяснения не придумать.
14
26 марта 2010 года
Phodopus
3.3K / / 19.06.2008
Только откуда выкопалось Int64 заместо Long - не понятно.
303
26 марта 2010 года
makbeth
1.0K / / 25.11.2004
Цитата: Phodopus
Только откуда выкопалось Int64 заместо Long - не понятно.


Видимо, отсюда: http://msdn.microsoft.com/en-us/library/y595sc15%28VS.80%29.aspx
Что-то неправильно?

14
26 марта 2010 года
Phodopus
3.3K / / 19.06.2008
А мне просто кажется здесь не VB.NET и соответственно вот.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог