Перейти к публикации
Дедовский городской форум
Maksim

вопрос С#

Рекомендованные сообщения

Надеюсь тема будет актуальная, в связи с растущей популярностью данной платформы.

 

Сам постараюсь давать развернутые ответы.

 

У меня вопрос такого плана:

через вебрекуест делаю запрос на "https://***" (после этого естествено его закрываю)

потом делаю опять запрос на этот же "https://***" и получаю вебексепшинс с

ErrorCode=10054

NativeErrorCode=10054

сетап KeepAlive в False не помог, иногда ексепшина нет и все пашет как надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

я так понимаю - это ASP.NET??

если показывает исключение, то попробуй проблемную строчку заключить в блоки try {} catch(Exeption) {} и блин тупо перебирать классы ошибок в catch(здест перебирать))) {}, а отладчик не пишет тип исключения??

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

это не аспе(класы webrequest webresponse).

код ошибки я написал(сервер рвет соединение)

тупо что-то перебирать это не наш метод;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Сегодня увидел такое своими глазами:

 

private void set_mode(bool mod)

{

if(mod==true)

{

label1.Enabled=true;

button1.Enabled=true;

button2.Enabled=true;

button3.Enabled=false;

button4.Enabled=false;

}

else

{

label1.Enabled=false;

button1.Enabled=false;

button2.Enabled=false;

button3.Enabled=true;

button4.Enabled=true;

}

}

аля запостил в _ttp://govnokod.ru/505 :25:

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
:laugh:, явно индус.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
У меня вопрос такого плана:

через вебрекуест делаю запрос на "https://***" (после этого естествено его закрываю)

потом делаю опять запрос на этот же "https://***" и получаю вебексепшинс с

ErrorCode=10054

NativeErrorCode=10054

сетап KeepAlive в False не помог, иногда ексепшина нет и все пашет как надо.

попробуй таймаут увеличить

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

.Timeout=10000;

не помогло - пробывал уже

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А что написал WebResponse?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ErrorCode=10054

_ttp://codeidol.com/csharp/csharp-network/Connectionless-Sockets/A-Complete-UDP-Application/

10054: Connection reset by peer

_ttp://forum.sources.ru/index.php?showtopic=101496

10054: Удаленный хост принудительно разорвал существующее подключение. :blink:

ссылки не в тему, но код ошибки тот же. Мозг был съеден, но решение я так и не нашел.

Изменено пользователем Maksim

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

вертифицировать чужой код иногда весело, наткнулся на такую конструкцию:

if (Connected == 0))

{

rez = setup();

fl_end = true; // выход

}

else

fl_end = true;

:D

пришлось сие выложить сюда:

_ttp://www.govnokod.ru/543

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Надеюсь тема будет актуальная, в связи с растущей популярностью данной платформы.

 

Сам постараюсь давать развернутые ответы.

 

У меня вопрос такого плана:

через вебрекуест делаю запрос на "https://***" (после этого естествено его закрываю)

потом делаю опять запрос на этот же "https://***" и получаю вебексепшинс с

ErrorCode=10054

NativeErrorCode=10054

сетап KeepAlive в False не помог, иногда ексепшина нет и все пашет как надо.

Referer Property(solved) :laugh:

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

From: Roman Akopov

To: Giorgi Dolidze

Subject: Agent+ Pocket ID generation

 

Привет, Гиоргий!

 

Просто пометка, чтобы мы не забыли об этой задаче.

----------------------------------------------------------------

From: Giorgi Dolidze

To: Roman Akopov

Subject: Re:Agent+ Pocket ID generation

 

Рома, пересылаю последнее письмо Агент+ по поводу идентификаторов.

В данный момент ситуация такая:

 

> Здравствуйте, Гиоргий.

>

> Мы провели эксперименты с получением идентификатора КПК через настольное приложение.

> Нашли несколько вариантов получения идентификатора, но к сожалению,

> возвращаемые идентификаторы не совпадают с идентификатором, который

> показывает Агент+ в КПК. Т.е. не удалось найти аналогию функции

> получения идентификатора, которую мы используем внутри КПК.

> Возникла идея сделать простенькое приложение, которое запускается

> на КПК и заносит его идентификатор в реестр, чтобы потом значение

> этого ключа можно было прочесть настольным приложением. Но и тут

> столкнулись с проблемой. Функция GetDeviceUniqueID() (применение

> этой функии рекомендовала нам Microsoft), которую мы используем в

> C++ в КПК, возвращает другой идентификатор! Не такой же, как в

> Агент+! Оказывается, результат работы этой функции каким-то образом

> зависит от контекста приложения. Каким образом — не понятно. Что

> интересно, очередное обновление программы Агент+ (т.е. каждый новый

> релиз) на работу этой функции не влияет, она каким-то образом

> привязывается к неизменяемой части приложения.

> В итоге получается, что единственный способ узнать идентификатор

> КПК по примеру работы функции GetDeviceUniqueID() — это запустить в

> КПК приложение Агент+, и чтобы это приложение при старте сохранило в

> реестре КПК возвращенный этой функцией идентификатор. Так сейчас в программе и реализовано.

> Возможно, имеет смысл отказаться от использования функции

> GetDeviceUniqueID() в пользу какой-то другой (например, есть в КПК

> функция KernelIoControl() с параметром IOCTL_HAL_GET_DEVICEID, но

> эту функцию Microsoft не рекомендует к применению), но это чревато

> возникновением совпадений идентификаторов на разных КПК, с чем мы

> недавно столкнулись, почему и были вынуждены перейти на применение функции GetDeviceUniqueID().

 

 

----------------------------------------------------------------

From: Roman Akopov

To: Giorgi Dolidze

Subject: Re:Agent+ Pocket ID generation

 

Гиоргий!

 

Во-первых, либо они не так поняли, либо вы им не так объяснили задачу. Мне никогда не было надо узнавать идентификатор КПК из настольного приложения.

 

Во-вторых, всё что нужно, это точные параметры, которые они передают GetDeviceUniqueID. Точное знаение этих параметров. Результат работы этой функции зависит только от них и не зависит от какого бы то ни было "контекста приложения". Это явно описано в документации. Представитель Агент+ ошибается, утверждая что другое приложение, передающее функции GetDeviceUniqueID те же самые параметры получит другой идентификатор.

 

Таким образом, нет никакой необходимости тратить время на дополнительные эксперименты. Всё что нужно, это фрагмент кода, вызывающий функцию GetDeviceUniqueID.

 

----------------------------------------------------------------

From: Giorgi Dolidze

To: Roman Akopov

Subject: Re:Agent+ Pocket ID generation

Attachment: GetDevID.zip

 

Рома, пересылаю последнее письмо Агент+ по поводу идентицикаторов.

Жду от тебя какого-либо результата

 

> Здравствуйте, Гиоргий.

>

> Хорошо, вот фрагмент нашей функции получения идентификатора КПК (исходник предназначен для использования в приложении для Windows Mobile).

> Если будет получаться совпадающий идентификатор с нашей программой, пожалуйста, дайте знать.

 

----------------------------------------------------------------

From: Roman Akopov

To: Giorgi Dolidze

Subject: Re:Agent+ Pocket ID generation

 

Гиоргий!

 

Ну собственно всё как я и предполагал. Вот интересный нам кусок кода, всего две строки:

 

#define APPLICATION_DATA "AgentPlus"

#define APPLICATION_DATA_LENGTH 15

 

Так как речь о компиляторе Microsoft C++ , то строка "AgentPlus" равнозначна описанию

const char data[] = {'A', 'g', 'e', 'n', 't', 'P', 'l', 'u', 's', '\0'}

 

Как можно видеть из описания выше, реальная длина данных 10 байт, 9 байт видимых символов и десятый завершающий нулевой байт. В то же время размер данных, передаваемый функции GetDeviceUniqueID составляет 15 байт. Совершенно естественно, что функция GetDeviceUniqueID не имеет возможности проверить корректность данной информации. IsBadReadPtr в данном случае поможет мало, так как права на чтение будут выданы странице памяти целиком (обычно 4096 байт), а не 10 байтам строки. Кроме того, после строки "AgentPlus" в памяти находятся данные других строковых констант программы.

 

Таким образом, элементарнейший анализ исходного кода показывает, что функция GetDeviceUniqueID получает в качестве входного параметра не только 10 запланированных байт, но и ещё 5 совершенно случайных байт информации, содержимое которых непредсказуемо.

 

Справедливости ради надо заметить, что ссылочные константы, коими являются строки, располагаются в памяти последовательно и всё не так уж непредсказуемо. Так, если говорить о версии программы к которой я имел доступ, строка "AgentPlus" располагается по смещению 0x14BF68 в файле AgentPlus.exe и по смещению 0xAF68 в секции '.data'. Следующий за ней 5 байт это 2 нулевых байта выравнивания до 4байтовой границы и первые три байта юникодной строки "GetDeviceUniqueID" в кодировке UTF16: 'G', '\0', 'e'. Таким образом полностью, фактически передаваемый паарметр выглядит как

const char data[] = {'A', 'g', 'e', 'n', 't', 'P', 'l', 'u', 's', '\0', '\0', '\0', 'G', '\0', '\e'}

 

Моя рекомендация заключается в том, чтобы

1) Исправить указанную выше ошибку. Передавать в функцию указатель на Луну далеко не самая хорошая идея.

2) Добиться совместимости с предыдущими версиями.

 

Обеих целей можно добиться коррекцией строки №3 файла GetDevID.cpp. Для этого необходимо заменить

#define APPLICATION_DATA "AgentPlus"

на

#define APPLICATION_DATA "AgentPlus\0\0\0G\0e"

Сопроводив эту странную константу поясняющим комментарием, дабы в дальнейшем она не подвергалась модификациям.

 

_ttp://www.rsdn.ru/forum/flame.comp/3331925.flat.19.aspx

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

получение идентификатора кпк.

 

using System;

using System.Collections.Generic;

using System.Text;

using System.Runtime.InteropServices;

 

namespace test

{

class get_hw_id

{

const Int32 METHOD_BUFFERED = 0;

const Int32 FILE_ANY_ACCESS = 0;

const Int32 FILE_DEVICE_HAL = 0x00000101;

 

const Int32 IOCTL_HAL_GET_DEVICEID = ((FILE_DEVICE_HAL) << 16) |

((FILE_ANY_ACCESS) << 14) | ((21) << 2) | (METHOD_BUFFERED);

// для WM2003

[DllImport("coredll.dll", SetLastError = true)]

private static extern bool KernelIoControl(Int32 dwIoControlCode, IntPtr lpInBuf, Int32 nInBufSize,

byte[] lpOutBuf, Int32 nOutBufSize, ref Int32 lpBytesReturned);

// для WM5 и выше

[DllImport("coredll.dll")]

private extern static int GetDeviceUniqueID(

[in, Out] byte[] appdata,

int cbApplictionData,

int dwDeviceIDVersion,

[in, Out] byte[] deviceIDOuput,

out uint pcbDeviceIDOutput);

 

 

// <summary>

// получение идентификатора кпк

// </summary>

// <returns>байтовый массив содержащий уникальный идентификатор кпк</returns>

public static byte[] get_uniqueID()

{

byte[] DeviceOutput = new byte[20];

uint SizeOut = 20;

int rez = -1;

try

{

rez = GetDeviceUniqueID(ASCIIEncoding.ASCII.GetBytes("Terminal3000".ToCharArray()), ASCIIEncoding.ASCII.GetBytes("Terminal3000".ToCharArray()).Length, 1, DeviceOutput, out SizeOut);

}

catch {/*функция не прошла*/ }

if (rez == 0)

{

// функция отработала нормально

return

DeviceOutput;

}

else

{

// получение идентификатора в wm5 и выше

int cb = 0;

byte[] buffer = new byte[256];

buffer[0] = 0;

buffer[1] = 1;

System.Text.StringBuilder sb = new System.Text.StringBuilder();

if (KernelIoControl(IOCTL_HAL_GET_DEVICEID, IntPtr.Zero, 0, buffer, buffer.Length, ref cb) == true)

{

Int32 dwPresetIDOffsset = BitConverter.ToInt32(buffer, 4);

Int32 dwPlatformIDOffset = BitConverter.ToInt32(buffer, 0xc);

Int32 dwPlatformIDSize = BitConverter.ToInt32(buffer, 0x10);

StringBuilder s = new StringBuilder();

s.Append(String.Format("{0:X8}{1:X4}{2:X4}{3:X4}",

BitConverter.ToInt32(buffer, dwPresetIDOffsset),

BitConverter.ToInt16(buffer, dwPresetIDOffsset + 4),

BitConverter.ToInt16(buffer, dwPresetIDOffsset + 6),

BitConverter.ToInt16(buffer, dwPresetIDOffsset + 8)));

for (int i = dwPlatformIDOffset; i < dwPlatformIDOffset + dwPlatformIDSize; i++)

{

s.Append(String.Format("{0:X2}", buffer));

}

return

ASCIIEncoding.ASCII.GetBytes(s.ToString().ToCharArray());

}

}

return null;

}

}

}

 

Максимизация окна формы на весь экран и блокировка всех хардварных клавиш на кпк.

 

using System;

using System.Collections.Generic;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using Microsoft.WindowsCE.Forms;

using System.Runtime.InteropServices;

 

 

namespace rf_pda_terminal

{

/// <summary>

/// Киоск

/// </summary>

public class Kiosk

{

private Form mainForm;

private IntPtr hwnd = IntPtr.Zero;

private IntPtr Hwnd

{

get

{

if (hwnd == IntPtr.Zero)

{

mainForm.Capture = true;

hwnd = GetCapture();

mainForm.Capture = false;

}

return hwnd;

}

}

 

public Kiosk(Form mainForm)

{

if (mainForm == null)

{

throw new System.ArgumentNullException();

}

this.mainForm = mainForm;

}

 

public void Start()

{

mainForm.ControlBox = false;

AllKeys(true);

EnableToolbar(false);

mainForm.WindowState = FormWindowState.Maximized;

 

SetWindowPos(Hwnd, 0, 0, 0, Screen.PrimaryScreen.Bounds.Width,

Screen.PrimaryScreen.Bounds.Height, SWP_SHOWWINDOW);

}

 

public void Stop()

{

AllKeys(false);

EnableToolbar(true);

}

 

public static void EnableToolbar(bool enabled)

{

IntPtr p = FindWindow("HHTaskBar", null);

if (p == IntPtr.Zero)

{

return;

}

 

IntPtr i = ShowWindow(p, enabled ? SW_SHOW : SW_HIDE);

bool b = EnableWindow(p, enabled);

}

 

#region P/Invoke declarations

 

const uint SIPF_OFF = 0x0;

const uint SIPF_ON = 0x1;

 

const int HWND_TOPMOST = -1;

const int SWP_SHOWWINDOW = 0x0040;

 

const int SW_HIDE = 0;

const int SW_SHOW = 1;

 

[DllImport("coredll.dll")]

private static extern bool AllKeys(bool bAllKeys);

 

[DllImport("coredll.dll")]

private static extern bool SetWindowPos(IntPtr hwnd, int hwnd2, int x, int y, int cx, int cy, int uFlags);

 

[DllImport("coredll.dll")]

private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

 

[DllImport("coredll.dll")]

private static extern IntPtr GetCapture();

 

[DllImport("coredll.dll")]

private static extern IntPtr ShowWindow(IntPtr hWnd, int visible);

 

[DllImport("coredll.dll")]

private static extern bool EnableWindow(IntPtr hwnd, bool enabled);

#endregion

 

}

}

 

класс-обертка для драйвера штрих-кода на кпк 9500

public class BarReader: MessageWindow

{

// константы сканера

private const int DC_READER_BC = 7;//сканер

private const int DC_READER_RFID = 32;// rfid реадер

private const int ALL_DEVICE = 255;

// сообщение окна об сканировании штрих-кода

private int WM_DECODEDATA;

// импорт нативных функций

[DllImport("coredll", SetLastError = true, CharSet = CharSet.Auto)]

private static extern int RegisterWindowMessage(string Message);

[DllImport("ReaderDll.dll")]

private static extern int InitReader();

[DllImport("ReaderDll.dll")]

private static extern int HaltReader(int nRdrType);

[DllImport("ReaderDll.dll")]

private static extern int SetTriggerKey(bool bEnable);

[DllImport("ReaderDll.dll")]

private static extern int GetDecodeType();

[DllImport("ReaderDll.dll")]

private static extern int GetDecodeData(byte[] lpBuf,int nBufSize);

//[DllImport("ReaderDll.dll")]

//private static extern int SetActiveDevice(int nActDC);

 

public delegate void DataReceived(object sender, EventArgs e);

// событие - сканирование штрих-окда

public event DataReceived Data;

 

public string raw_data;// сканированные данные

// <summary>

// инициализация сканера

// </summary>

// <returns>0 - сканер проинициализирован</returns>

public int Init()

{

WM_DECODEDATA=RegisterWindowMessage("WM_DECODEDATA");// регистрация оконного сообщения о сканировании штрих-кода

return InitReader();

}

// <summary>

// включение и выключение клавиши сканирования

// </summary>

// <param name="on">true- включено, false - выключено</param>

// <returns></returns>

public int Key(bool on)

{

return SetTriggerKey(on);

}

// <summary>

// уничтожение сканера

// </summary>

// <returns></returns>

public int Halt()

{

return HaltReader(DC_READER_BC);

}

//????????????????????

//public int read()

//{

// int i =SetActiveDevice(DC_READER_BC);

// return i;

//}

//??????????????

public int decode()

{

byte[] data = new byte[128];

int i = GetDecodeType();

i = GetDecodeData(data, data.Length);

ASCIIEncoding ae = new ASCIIEncoding();

raw_data = ae.GetString(data, 0, data.Length).Substring(0, raw_data.IndexOf("\0"));

return i;

}

// <summary>

// перезагрузка оконной процедуры обработки сообщений ос

// </summary>

// <param name="msg">сообщения ос</param>

protected override void WndProc(ref Message msg)

{

 

if(msg.Msg==WM_DECODEDATA)// перехват сообщения от сканера

{

if (msg.WParam == (IntPtr)DC_READER_BC)// штрих-код

{

byte[] data = new byte[128];

GetDecodeData(data, data.Length);// сканирование прошло успешно

 

// первичное декодирование, формирование строки

ASCIIEncoding ae = new ASCIIEncoding();

raw_data = ae.GetString(data, 0, data.Length);

raw_data = raw_data.Substring(0, raw_data.IndexOf("\0"));

Data(this, null);// генерирование события

 

}

}

base.WndProc(ref msg);// отправка других сообщений ос на обработку

}

 

запуск сторонней проги

 

using System;

using System.Drawing;

using System.Collections;

using System.Windows.Forms;

using System.Data;

using System.Runtime.InteropServices;

 

namespace SmartDeviceApplication

{

///

/// Summary description for Form1.

///

public class Form1 : System.Windows.Forms.Form

{

private System.Windows.Forms.Button button1;

private System.Windows.Forms.MainMenu mainMenu1;

public class ProcessInfo

{

public IntPtr hProcess;

public IntPtr hThread;

public Int32 ProcessId;

public Int32 ThreadId;

}

 

[DllImport("CoreDll.DLL", SetLastError=true)]

private extern static

int CreateProcess( String imageName,

String cmdLine,

IntPtr lpProcessAttributes,

IntPtr lpThreadAttributes,

Int32 boolInheritHandles,

Int32 dwCreationFlags,

IntPtr lpEnvironment,

IntPtr lpszCurrentDir,

byte [] si,

ProcessInfo pi );

 

[DllImport("CoreDll.dll")]

private extern static

Int32 GetLastError();

 

[DllImport("CoreDll.dll")]

private extern static

Int32 WaitForSingleObject( IntPtr Handle,

Int32 Wait);

 

 

public static bool CreateProcess( String ExeName, String CmdLine, ProcessInfo pi )

{

Int32 INFINITE;

unchecked {INFINITE = (int)0xFFFFFFFF;}

 

if ( pi == null )

pi = new ProcessInfo();

byte [] si = new byte[128];

CreateProcess(ExeName, CmdLine, IntPtr.Zero, IntPtr.Zero,

0, 0, IntPtr.Zero, IntPtr.Zero, si, pi);

WaitForSingleObject(pi.hProcess,INFINITE);

return true;

}

public Form1()

{

//

// Required for Windows Form Designer support

//

InitializeComponent();

 

//

// TODO: Add any constructor code after InitializeComponent call

//

}

///

/// Clean up any resources being used.

///

protected override void Dispose( bool disposing )

{

base.Dispose( disposing );

}

#region Windows Form Designer generated code

///

/// Required method for Designer support - do not modify

/// the contents of this method with the code editor.

///

private void InitializeComponent()

{

this.mainMenu1 = new System.Windows.Forms.MainMenu();

this.button1 = new System.Windows.Forms.Button();

//

// button1

//

this.button1.Location = new System.Drawing.Point(48, 96);

this.button1.Text = "button1";

this.button1.Click += new System.EventHandler(this.button1_Click);

//

// Form1

//

this.Controls.Add(this.button1);

this.Menu = this.mainMenu1;

this.Text = "Form1";

 

}

#endregion

 

///

/// The main entry point for the application.

///

 

static void Main()

{

Application.Run(new Form1());

}

 

private void button1_Click(object sender, System.EventArgs e)

{

String progPath = "Calc.exe";

 

ProcessInfo pi = new ProcessInfo();

 

if ( CreateProcess(progPath, "", pi) )

MessageBox.Show("Success! PID = " + pi.ProcessId.ToString());

else

MessageBox.Show("Failed! System Error = " + GetLastError().ToString());

 

MessageBox.Show("Done Waiting");

}

}

}

бик на кпк

[DllImport("coredll.dll")]

extern static void MessageBeep(uint BeepType);

 

/*по контексту:*/

private void Button1_Click(object sender, EventArgs e)

{

MessageBeep(0);

}

 

ну хватит для начала.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

рекурсивная реализация GetFiles в CF

// </summary>

// <param name="path">директория</param>

// <param name="searchPattern">фильтр файлов, разделенных ;</param>

// <param name="includeSubFolders">включать поддиректории</param>

// <returns></returns>

public static string[] GetFiles(string path, string searchPattern, bool includeSubFolders)

{

string[] patterns = searchPattern.Split(';');

ArrayList files = new ArrayList();// список файлов

if (includeSubFolders)

{// включая поддиректории

get_files(path, patterns, ref files);

}

else

{

try

{

for (int i = 0; i < patterns.Length; i++)

{

string[] curFiles = Directory.GetFiles(path, patterns);// сканиоване текущей папки

files.AddRange(curFiles);// добавка файлов

}

}

catch

{ }

}

return (string[])files.ToArray(typeof(string));

}

// <summary>

// рекурсивный метод составления списка файлов в директории и поддиректориях

// </summary>

// <param name="path">путь</param>

// <param name="searchPattern">фильтр</param>

// <param name="files">список файлов</param>

private static void get_files(string path, string[] searchPattern, ref ArrayList files)

{

try

{

string[] folders = Directory.GetDirectories(path);

for (int i = 0; i < folders.Length; i++)

get_files(folders, searchPattern, ref files);

 

 

for (int i = 0; i < searchPattern.Length; i++)

{

string[] curFiles = Directory.GetFiles(path, searchPattern);

files.AddRange(curFiles);

}

}

catch

{ }

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ErrorCode=10054

_ttp://codeidol.com/csharp/csharp-network/Connectionless-Sockets/A-Complete-UDP-Application/

10054: Connection reset by peer

_ttp://forum.sources.ru/index.php?showtopic=101496

10054: Удаленный хост принудительно разорвал существующее подключение. :blink:

ссылки не в тему, но код ошибки тот же. Мозг был съеден, но решение я так и не нашел.

 

Говорил я тебе, не ставь радиорелейку перед серваком. :tongue:

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

не стал я новую тему для этого заводить.

 

Кому нужен Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1 обращайтесь ко мне.

 

или ищите по ТТН в децешке WIAYVK6EJR3WUVH7STXQDV2DM7DWIVAHMD2Y5KQ

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

kozdik, один вопрос,- качать сдк влом из-за этого, там классы секурности такие же как в висте?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
kozdik, один вопрос,- качать сдк влом из-за этого, там классы секурности такие же как в висте?

 

вот ты спросил, :). 

 

для меня это покамест самый свежий сдк. я ваще то не выползаю выше стандартного винапи32 в программировании под вынь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

// класс реализующий базовый функционал FileVersionInfo отсутствующий в compact framework

получение инфы о файле: дискриптор, компания, имя и другие, но не всех, кому надо будет - добавит ему нужные из списка:

#define VERINFO_comments "comments"
#define VERINFO_CompanyName "CompanyName"
#define VERINFO_FileDescrib "FileDescription"
#define VERINFO_FileVersion "FileVersion"
#define VERINFO_InternalName "InternalName"
#define VERINFO_LegalCopyright "LegalCopyright"
#define VERINFO_LegalTrademarks "LegalTrademarks"
#define VERINFO_OriginalFilename "OriginalFilename"
#define VERINFO_ProductName "ProductName"
#define VERINFO_ProductVersion "ProductVersion"
#define VERINFO_PrivateBuild "PrivateBuild"
#define VERINFO_SpecialBuild "SpecialBuild"

 

для работы нужно только:

using System.Runtime.InteropServices;

 

 

 

	public sealed class FileVersionInfo
{

	private FileVersionInfo()
	{

	}

	#region Variables
	private string fileDescription;
	private string companyName;
	private string productName;
	private string legalTrademarks;
	private string productVersion;
	private string filename;
	private string originalFilename; 
	#endregion

	#region pinvoke winapi
	[DllImport("coredll.dll")]
	public static extern bool GetFileVersionInfo(string sFileName,
		  int handle, int size, byte[] infoBuffer);
	[DllImport("coredll.dll")]
	public static extern int GetFileVersionInfoSize(string sFileName,
		  out int handle);
	[DllImport("coredll.dll")]
	public static extern bool VerQueryValue(byte[] pBlock,
		  string pSubBlock, out string pValue, out uint len);

	[DllImport("coredll.dll")]
	public static extern bool VerQueryValue(byte[] pBlock,
		  string pSubBlock, out IntPtr pValue, out uint len);

	#endregion

	#region Properties
	public string CompanyName
	{
		get { return companyName; }
	}
	public string FileDescription
	{
		get { return fileDescription; }
	}

	public string LegalTrademarks
	{
		get { return legalTrademarks; }
	}
	public string OriginalFilename
	{
		get { return originalFilename; }
	}
	public string ProductName
	{
		get { return productName; }
	}
	public string ProductVersion
	{
		get { return productVersion; }
	}
	public string Filename
	{
		get { return filename; }
	} 
	#endregion

	public static FileVersionInfo GetVersionInfo(string filename)
	{
		FileVersionInfo fvi = new FileVersionInfo();
		string versionInfo;
		try
		{
			int handle = 0;
			int size =
				  GetFileVersionInfoSize(filename,
				  out handle);

			if (size == 0)
				return null;

			byte[] buffer = new byte[size];

			if (!GetFileVersionInfo(filename,
handle, size, buffer))
			{
				return null;
			}
			IntPtr subBlock = IntPtr.Zero;
			uint len = 0;
			if (!VerQueryValue(buffer,
@"\VarFileInfo\Translation", out subBlock, out len))
			{
				return null;
			}
			int p = (int)subBlock;
			int i1 = Marshal.ReadInt16((IntPtr)p);
			p += 2;
			int i2 = Marshal.ReadInt16((IntPtr)p);
			string s = @"\StringFileInfo\" + String.Format("{0:X4}{1:X4}", i1, i2);

			if (!VerQueryValue(buffer, s + @"\FileDescription", out
versionInfo, out len))
			{
				fvi.fileDescription = "";
			}
			else
				fvi.fileDescription = versionInfo;
			if (!VerQueryValue(buffer, s + @"\CompanyName", out
versionInfo, out len))
			{
				fvi.companyName = "";
			}
			else
				fvi.companyName = versionInfo;
			if (!VerQueryValue(buffer, s + @"\ProductName", out
versionInfo, out len))
			{
				fvi.productName = "";
			}
			else
				fvi.productName = versionInfo;
			if (!VerQueryValue(buffer, s + @"\LegalTrademarks", out
versionInfo, out len))
			{
				fvi.legalTrademarks = "";
			}
			else
				fvi.legalTrademarks = versionInfo;
			if (!VerQueryValue(buffer, s + @"\ProductVersion", out
versionInfo, out len))
			{
				fvi.productVersion = "";
			}
			else
				fvi.productVersion = versionInfo;
			fvi.filename = filename;
			if (!VerQueryValue(buffer, s + @"\OriginalFilename", out
versionInfo, out len))
			{
				fvi.originalFilename = "";
			}
			else
				fvi.originalFilename = versionInfo;
		}
		catch (Exception e)
		{
			return null;// так делать ловить ексепшн нельзя на самом деле
		}

		return fvi;
	}
}

 

 

 

есть реализация этого же на плюсах(писал либу с похмелья утром, так как не знал как обойти unsafe short*, думал маршалинг устроить через неё, к счастью, к обеду это прошло)

Изменено пользователем Maksim

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

// <summary>

// класс для установки времени в системе

// </summary>

 

  class manipulator_time
{
	#region winapi
	[DllImport("coredll.dll")]

	private struct SYSTEMTIME
	{
		public ushort wYear;
		public ushort wMonth;
		public ushort wDayOfWeek;
		public ushort wDay;
		public ushort wHour;
		public ushort wMinute;
		public ushort wSecond;
		public ushort wMilliseconds;
	} 
	#endregion

	// метод установки системного времени
	// </summary>
	// <param name="t">структура для хранения времени</param>
	// <returns>
	// 0 - операция завершена успешно
	// не ноль - операция завершена не успешно
	// </returns>
	public static int SetTime(DateTime t)
	{
		SYSTEMTIME systime = new SYSTEMTIME();
		systime.wYear = (ushort)t.ToUniversalTime().Year;
		systime.wMonth = (ushort)t.ToUniversalTime().Month;
		systime.wDay = (ushort)t.ToUniversalTime().Day;
		systime.wHour = (ushort)t.ToUniversalTime().Hour;
		systime.wMinute = (ushort)t.ToUniversalTime().Minute;
		systime.wSecond = (ushort)t.ToUniversalTime().Second;
		systime.wMilliseconds = (ushort)t.ToUniversalTime().Millisecond;
		return SetSystemTime(ref systime)==0?1:0;

	}
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Microsoft сообщила об открытии исходного кода компиляторов Visual Basic и C#

 

В то время как конкурирующие компании анонсируют новые, «более современные» языки программирования, корпорация Microsoft продолжает трудиться над усовершенствованием существующих, проверенных временем инструментов. На конференции разработчиков Microsoft Professional Developers Conference (PDC) 2009 Лука Болоньезе (Luca Bolognese), руководитель языкового подразделения Microsoft, сообщил о ведущихся работах по модернизации таких распространенных языков программирования, как Visual Basic и C#.

 

Microsoft сообщила об открытии исходного кода компиляторов Visual Basic и C#

 

Разработчики приложений на Visual Basic и C# One смогут оценить поддержку асинхронного программирования и неизменности (immutability). Обе эти особенности, упрощающие разработку программного обеспечения, запускаемого на многоядерных системах, уже реализованы в языке Microsoft's F#. Кроме того, в ближайших планах Microsoft значится предоставление разработчикам доступа к программному коду компиляторов C# и Visual Basic. Компиляторы более не будут представлять собой «черные ящики», что позволит повысить качество создаваемых продуктов.

 

В дальнейшем названные языки программирования будут развиваться параллельно, согласно выбранной производителем стратегии «совместной эволюции». Это означает, что любое заметное усовершенствование будет одновременно реализовываться в обоих языках, а в обозримом будущем Visual Basic и C# будут объединены в единый язык программирования.

 

По материалам сайта eWeek.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

×
×
  • Создать...