Ahh ... похоже, что я был пойман одной из самых больших ошибок в WinOPI-программировании. Кроме того, публикация кода для моих объявлений функций была бы мудрой идеей в этом случае.
В любом случае, все, что мне нужно было сделать, это добавить аргумент в атрибут DllImport функции, задающей CharSet = CharSet.Unicode
. Это сделало трюк как для функций CreateProcessWithLogonW
, так и для CreateProcessWithTokenW
. Я предполагаю, что это, наконец, просто поразило меня тем, что W-суффикс имен функций относится к Unicode и что мне нужно явно указать это на C #! Вот правильные функции в случае, если кому-то интересно:
[DllImport("advapi32", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern bool CreateProcessWithLogonW(string principal, string authority,
string password, LogonFlags logonFlags, string appName, string cmdLine,
CreationFlags creationFlags, IntPtr environmentBlock, string currentDirectory,
ref STARTUPINFO startupInfo, out PROCESS_INFORMATION processInfo);
[DllImport("advapi32", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern bool CreateProcessWithTokenW(IntPtr hToken, LogonFlags dwLogonFlags,
string lpApplicationName, string lpCommandLine, CreationFlags dwCreationFlags,
IntPtr lpEnvironment, string lpCurrentDirectory, [In] ref STARTUPINFO lpStartupInfo,
out PROCESS_INFORMATION lpProcessInformation);
Границы UIView - это прямоугольник , выраженный как местоположение (x, y) и размер (ширина , высота) относительно собственной системы координат (0,0).
Кадр UIView представляет собой прямоугольник , выраженный как местоположение ( x, y) и размер (ширина, высота) относительно супервизора, в котором оно содержится.
Итак, представьте себе представление, имеющее размер 100x100 (ширина x высота), расположенное в 25,25 (x, y) его надзор. Следующий код распечатывает границы и фрейм этого представления:
// This method is in the view controller of the superview
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"bounds.origin.x: %f", label.bounds.origin.x);
NSLog(@"bounds.origin.y: %f", label.bounds.origin.y);
NSLog(@"bounds.size.width: %f", label.bounds.size.width);
NSLog(@"bounds.size.height: %f", label.bounds.size.height);
NSLog(@"frame.origin.x: %f", label.frame.origin.x);
NSLog(@"frame.origin.y: %f", label.frame.origin.y);
NSLog(@"frame.size.width: %f", label.frame.size.width);
NSLog(@"frame.size.height: %f", label.frame.size.height);
}
И вывод этого кода:
bounds.origin.x: 0
bounds.origin.y: 0
bounds.size.width: 100
bounds.size.height: 100
frame.origin.x: 25
frame.origin.y: 25
frame.size.width: 100
frame.size.height: 100
Итак, мы можем видеть, что в обоих случаях ширина и высота представления одинаковы независимо от того, смотрите на границы или рамку. Отличается позиционирование вида по осям x и y. В случае границ координаты x и y равны 0,0, поскольку эти координаты относятся к самому виду. Однако координаты x и y кадра относятся к положению представления в родительском представлении (которое ранее, как мы говорили, было на 25,25).
Существует также отличная презентация , которая охватывает UIViews . См. Слайды 1-20, на которых не только объясняется разница между рамками и границами, но и показаны наглядные примеры.
Позвольте мне добавить свои 5 центов.
Кадр используется родительским представлением представления для размещения его в родительском представлении.
Границы используются самим представлением для размещения, свое собственное содержание (как представление прокрутки делает при прокрутке). См. также clipsToBounds. Границы также могут привыкнуть к увеличению / контент представления.