Подключение модуля ActiveX: перевести код с VB .NET
21.11.2012, 16:22. Показов 3096. Ответов 2
Всем привет, сразу оговорюсь, что навыки программирования не высокие, но стоит задача подключить модуль Active X в C#. Есть пример на VB, надо переделать в C#, на данный момент было кое-что сделано, но встречаются ошибки. Помогите плиз разобраться.
Пример на VB: VB.NET | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
| ' Главный компонент системы, обеспечивающий подключение к Wialon
Dim Wialon As Object
' Коллекция доступных объектов
Dim Units As Object
' Отдельный объект
Dim Unit As Object
' Строка ошибки Wialon
Dim ErrStr As String
' Коллекция сообщений от объекта
Dim Msgs As Object
' Счетчик
Dim i As Long
' Количество объектов в коллекции
Dim CountOfUnits As Long
' Создание объекта для подключения к Wialon (для 64-битных приложений — WialonActiveX64)
Wialon = CreateObject("WialonActiveX.WialonConnection")
' Проверка подключения
If Wialon Is Nothing Then
' Если ошибка, то вывод сообщения
MsgBox("No Object")
Return
End If
' Установка настроек соединения через прокси-сервер
Wialon.SetProxyMode "ProxyHost", 8080, "Login:Passw"
' Получение всех доступных объектов пользователю user с паролем passw,
' от сервера [url]https://activex.gurtam.com[/url] (префикс необходим для подключения
' по защищенному соединению) на 443 порту, без прокси сервера
Units = Wialon.Login("https://activex.gurtam.com", 443, "user", "passw")
' Проверка доступности объектов
If Units Is Nothing Then
' Если объекты недоступны, то получаем ошибку элемента ActiveX, а также ошибку от Wialon
MsgBox("Error = " + Err.Number.ToString() + ": " + Err.Source.ToString() + " (" + Err.Description.ToString() + ")")
' Получение ошибки от сервера Wialon
ErrStr = Wialon.GetLastError()
MsgBox("Wialon error: " + ErrStr)
Return
End If
' Получение количества доступных объектов
CountOfUnits = Units.Count
' Вывод сообщения о количестве доступных объектов на экран
MsgBox("Units = " + CountOfUnits.ToString())
' Запуск цикла для перебора всех объектов
For i = 1 To CountOfUnits
' Получение объекта из коллекции
Unit = Units.Item(i)
' Проверка, получен ли объект
If Unit Is Nothing Then
' Если объект не получен, скорее всего произошла ошибка — выход
MsgBox("Not unit")
Return
End If
' Установка флага получения адресов по координатам. False — без адресов (быстрее). True — с адресами (медленнее).
Unit.ResolveLocations (False)
' Получение сообщений от объекта за период (время в UNIX формате с 1 января 1970 г.)
Msgs = Unit.GetMessages(1255112326, 1256312326)
' Проверка, получены ли сообщения
If Msgs Is Nothing Then
' Вывод сообщения, что сообщения не получены
MsgBox("No messages for unit: " + Unit.Name)
Else
' Вывод количества сообщений, полученных от объекта
MsgBox("Messages = " + Msgs.Count.ToString())
' Уменьшение значения счетчика ссылок для предоставленной вызываемой оболочки среды CLR
' (выполнять, если необходимо, явное освобождение памяти после использования объекта)
System.Runtime.InteropServices.Marshal.ReleaseComObject(Msgs)
' Релиз объекта с сообщениями
Msgs = Nothing
End If
' Уменьшение значения счетчика ссылок для предоставленной вызываемой оболочки среды CLR
' (выполнять, если необходимо, явное освобождение памяти после использования объекта)
System.Runtime.InteropServices.Marshal.ReleaseComObject(Unit)
' Релиз объекта с объектом :)
Unit = Nothing
Next i
' Уменьшение значения счетчика ссылок для предоставленной вызываемой оболочки среды CLR
' (выполнять, если необходимо, явное освобождение памяти после использования объекта)
System.Runtime.InteropServices.Marshal.ReleaseComObject(Units)
' Всё, конец программы, больше не будем работать с этими объектами, делаем релиз
Units = Nothing
Wialon = Nothing
' Конец
MsgBox("End") |
|
Код на C#:
C# | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
| // Главный компонент системы, обеспечивающий подключение к Wialon
SystemWialon.IWialonConnection WialonConn;
//Коллекция доступных объектов
SystemWialon.IWialonCollection WUnits;
// Отдельный объект
SystemWialon.IWialonUnit WUnit;
// Строка ошибки Wialon
string WErrStr;
// Коллекция сообщений от объекта
SystemWialon.IWialonCollection WMsgs;
// Количество объектов в коллекции
long WCountOfUnits;
int f = 0;//значение false
// Установка настроек соединения через прокси-сервер
WialonConn.SetProxyMode("ProxyHost", 8080, "Login:Passw");//просит присвоить значение локальному объекту, непонятно зачем и как его присвоить?
// Получение всех доступных объектов пользователю user с паролем passw,
// от сервера [url]https://activex.gurtam.com[/url] (префикс необходим для подключения
// по защищенному соединению) на 443 порту, без прокси сервера
WUnits = WialonConn.Login("https://activex.gurtam.com", 443, "user", "passw");
// Проверка доступности объектов
if (WUnits == null)
{
// Если объекты недоступны, то получаем ошибку элемента ActiveX, а также ошибку от Wialon
// Console.WriteLine("Error = " + Err.Number.ToString() + ": " + Err.Source.ToString() + " (" + Err.Description.ToString() + ")");
// Получение ошибки от сервера Wialon
// WErrStr = WialonConn.GetLastError();
WErrStr = WialonConn.GetLastError();
Console.WriteLine("Wialon error:" + WErrStr);
}
else
return;
//' Получение количества доступных объектов
WCountOfUnits = WUnits.Count;
//' Вывод сообщения о количестве доступных объектов на экран
Console.WriteLine("Units = " + WCountOfUnits.ToString());
//' Запуск цикла для перебора всех объектов
for (int i = 1; i < WUnits.Count; i++)
{
// Получение объекта из коллекции
WUnit = WUnits[i];
// ' Проверка, получен ли объект
if (WUnit == null)
// ' Если объект не получен, скорее всего произошла ошибка — выход
Console.WriteLine("Not unit"); return;
// ' Установка флага получения адресов по координатам. False — без адресов (быстрее). True — с адресами (медленнее).
WUnit.ResolveLocations(f);// Не понятно как ставить флаг, который определяет есть значение у f или его нету?
if (f==0)
// Получение сообщений от объекта за период (время в UNIX формате с 1 января 1970 г.)
WMsgs = WUnit.GetMessages(1255112326, 1256312326);
// Проверка, получены ли сообщения
if (WMsgs == null)
{
// ' Вывод сообщения, что сообщения не получены
Console.WriteLine("No messages for unit: " + WUnit.Name);
}
else
{
// ' Вывод количества сообщений, полученных от объекта
Console.WriteLine("Messages = " + WMsgs.Count.ToString());
// ' Уменьшение значения счетчика ссылок для предоставленной вызываемой оболочки среды CLR
// ' (выполнять, если необходимо, явное освобождение памяти после использования объекта)
System.Runtime.InteropServices.Marshal.ReleaseComObject(WMsgs);
// ' Релиз объекта с сообщениями
WMsgs = null;
}
// ' Уменьшение значения счетчика ссылок для предоставленной вызываемой оболочки среды CLR
// ' (выполнять, если необходимо, явное освобождение памяти после использования объекта)
System.Runtime.InteropServices.Marshal.ReleaseComObject(WUnit);
// ' Релиз объекта с объектом :)
WUnit = null;
}
//' Уменьшение значения счетчика ссылок для предоставленной вызываемой оболочки среды CLR
//' (выполнять, если необходимо, явное освобождение памяти после использования объекта)
System.Runtime.InteropServices.Marshal.ReleaseComObject(WUnits);
//' Всё, конец программы, больше не будем работать с этими объектами, делаем релиз
WUnits = null;
WialonConn = null;
//' Конец
Console.WriteLine("End");
} |
|
Буду очень признателен за помощь
Добавлено через 4 часа 1 минуту
С первой ошибкой разобрался, необходимо прописать следующее
C# | 1
2
| Type xLApp = Type.GetTypeFromProgID("WialonActiveXLib.WialonConnections");
WialonConn = (WialonActiveXLib.WialonConnection)Activator.CreateInstance(xLApp); |
|
0
|