Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Как в 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.055 c
15-1344976202
Юрий
2012-08-15 00:30
2013.03.22
С днем рождения ! 15 августа 2012 среда


15-1350648132
toto
2012-10-19 16:02
2013.03.22
C# GridView


2-1339918135
Pcrepair
2012-06-17 11:28
2013.03.22
Структура кода при обработке текстов


15-1345822753
brother
2012-08-24 19:39
2013.03.22
Сис админ - диагноз?


2-1340259923
vasa777
2012-06-21 10:25
2013.03.22
компилятор