Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизКак в var параметр передать nil? Найти похожие ветки
← →
Дмитрий С © (2012-10-30 18:10) [0]Например из генофонда:
function StartService(hService: SC_HANDLE; dwNumServiceArgs: DWORD;
var lpServiceArgVectors: PWideChar): BOOL; stdcall;
Если я не хочу передавать аргументы в службу я должен передать NULL в третий параметр ( http://msdn.microsoft.com/en-us/library/windows/desktop/ms686321%28v=vs.85%29.aspx )
Ну и как быть?
← →
Игорь Шевченко © (2012-10-30 18:12) [1]PWideChar(0)^
← →
Eraser © (2012-10-30 18:13) [2]
> Дмитрий С © (30.10.12 18:10)
это описание функции с ошибкой, вот правильный вариантfunction StartService(hService: SC_HANDLE; dwNumServiceArgs: DWORD;
lpServiceArgVectors: LPCTSTR): BOOL; stdcall;
PS
делфи 7 что ли опять?
← →
брат Птибурдукова (2012-10-30 18:21) [3]
> Игорь Шевченко © (30.10.12 18:12) [1]
Не компиляется.
> Eraser © (30.10.12 18:13) [2]
Почему с ошибкой? вроде ж оба варианта равнозначны с точки зрения системы? (Твой удобней, бесспорно.)
← →
AV © (2012-10-30 18:29) [4]http://msdn.microsoft.com/en-us/library/windows/desktop/ms686321%28v=vs.85%29.aspx
нормально работаетtemp := nil;
if (StartService(h_svc,0,temp)) then
if (QueryServiceStatus(h_svc,svc_status)) then
← →
Eraser © (2012-10-30 18:29) [5]
> брат Птибурдукова (30.10.12 18:21) [3]
> вроде ж оба варианта равнозначны с точки зрения системы?
в первом случае, указатель на указатель, во втором - указатель. или я что-то путаю.
ну суть не в том даже, генофонд периодически грешит тем, что вставляет var, там, где удобнее было бы вставить указатель. получается что nil не передашь. несколько раз сталкивался.
← →
Игорь Шевченко © (2012-10-30 18:29) [6]
> Не компиляется.
PWideChar(nil)^ - так компиляется ?
← →
Eraser © (2012-10-30 18:31) [7]
> Игорь Шевченко © (30.10.12 18:29) [6]
кстати, спасибо. если это действительно работает (сейчас проверить не могу) - полезный "хак".
← →
брат Птибурдукова (2012-10-30 18:36) [8]
> AV © (30.10.12 18:29) [4]
Так он же спрашивал, как временную переменную не заводить, не?
> Игорь Шевченко © (30.10.12 18:29) [6]
И так тоже нет. Насколько я знаю, без временной переменной не обойтись.
> ну суть не в том даже, генофонд периодически грешит тем,
> что вставляет var, там, где удобнее было бы вставить указатель.
> получается что nil не передашь. несколько раз сталкивался.
Это да...
← →
AV © (2012-10-30 18:41) [9]
> он же спрашивал, как временную переменную не заводить, не?
а надо заводить
← →
Игорь Шевченко © (2012-10-30 18:46) [10]брат Птибурдукова (30.10.12 18:36) [8]
Какой ты настырныйtype
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
procedure Foo(var Bar: PWideChar);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Foo(PPWideChar(nil)^);
end;
procedure TForm1.Foo(var Bar: PWideChar);
begin
ShowMessage("Bar");
end;
← →
брат Птибурдукова (2012-10-30 18:52) [11]
> в первом случае, указатель на указатель, во втором - указатель.
> или я что-то путаю.
Вот что говорит пресвятой МСДН:BOOL WINAPI StartService(
__in SC_HANDLE hService,
__in DWORD dwNumServiceArgs,
__in_opt LPCTSTR* lpServiceArgVectors
);
> Какой ты настырный
На том стоим. ;-)
> Foo(PPWideChar(nil)^);
Спасибо. А в предыдущих сообщениях PPWideChar не фигурировал.
← →
Rouse_ © (2012-10-30 19:25) [12]
> в первом случае, указатель на указатель, во втором - указатель.
в обоих случаях указатель на указатель
← →
Игорь Шевченко © (2012-10-30 20:07) [13]брат Птибурдукова (30.10.12 18:52) [11]
> А в предыдущих сообщениях PPWideChar не фигурировал.
В самом первом сообщении была идея - привести 0 (nil) к типу указателя и разыменовать его. А то, что в буковках ошибся - ну, бывает :)
← →
Дмитрий С © (2012-10-30 20:55) [14]
> PPWideChar(0)^
Спасибо.
> temp := nil;
> if (StartService(h_svc,0,temp)) then
> if (QueryServiceStatus(h_svc,svc_status)) then
ты уже не nil передаешь.
← →
AV © (2012-10-31 10:03) [15]>> ты уже не nil передаешь.
ну не знаю..
там требуется var-параметр. Надо дать.
Никто не сомневается в мастерстве ИШ, но
А если потом когда-нибудь будет что-то возвращаться в нем?
← →
Rouse_ © (2012-10-31 10:10) [16]
> А если потом когда-нибудь будет что-то возвращаться в нем?
Будет большой бадабум во всех программах которые делают запуск сервиса без командной строки.
← →
Дмитрий С © (2012-10-31 10:46) [17]
> А если потом когда-нибудь будет что-то возвращаться в нем?
в msdn написано четко, передайте null, если нет параметров, а еще написано, что это in параметр, так что ничего не будет.
Я думаю программисты Delphi по ошибке (или это сделал конвертирующий робот) написали там Var параметр, подумав, что если тип параметра PPWideChar, значит функция в него заносит какое-то значение.
← →
Rouse_ © (2012-10-31 10:57) [18]
> подумав, что если тип параметра PPWideChar, значит функция
> в него заносит какое-то значение.
Подумав? :) Сделали они это явно не подумав. Просто var это параметр идущий по ссылке, поэтому так и получилось что PP = var P, но в первом варианте можно было ничего не передавать, тогда как во втором случае из-за особенностей языка требуется переменная.
← →
anatoly podgoretsky © (2012-10-31 15:05) [19]У них таких мест много, совершенно не думали
← →
han_malign (2012-10-31 16:13) [20]
> У них таких мест много, совершенно не думали
- авто-конверторы h2pas - вообще глубиной мысли не отличаются...
А мест где необходимо прямое приведение типов - полно везде... Фактически это является подписью программиста - "я являюсь квалифицированным специалистом, внимательно изучил документацию, а в случае - если чего неправильно понял - претензий к разработчику интерфейса не имею"...
← →
Eraser © (2012-10-31 18:24) [21]
> Rouse_ © (30.10.12 19:25) [12]
и то верно.
тогда уместнее всего было бы тут нечто вродеfunction StartService(hService: SC_HANDLE; dwNumServiceArgs: DWORD;
lpServiceArgVectors: PPWideChar): BOOL; stdcall;
для понятности, так сказать.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.073 c