Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.068 c
15-1330115402
Юрий
2012-02-25 00:30
2013.03.22
С днем рождения ! 25 февраля 2012 суббота


2-1345111451
Дмитрий Белькевич
2012-08-16 14:04
2013.03.22
Найти вернее окно (форму) среди нескольких одинаковых


15-1348061625
xayam
2012-09-19 17:33
2013.03.22
Демонстрационное оборудование


2-1344332083
ramster
2012-08-07 13:34
2013.03.22
юникод DelphiXE


3-1279853308
dm37
2010-07-23 06:48
2013.03.22
Несколько запросов одновременно через один ADOConnection





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский