Иллюстрированный самоучитель по Visual Basic .NET

COM Interop и вызовы функций DLL. Вызовы функций DLL.

Несмотря на появление .NET, существующий код на базе СОМ еще не собирается умирать. К счастью, уровень взаимодействия с СОМ в .NET работает очень хорошо. С другой стороны, использование СОМ в проектах .NET снижает быстродействие и затрудняет сопровождение программ, поэтому эти технологии объединяются лишь при крайней необходимости.

В Visual Studio .NET взаимодействие с СОМ почти не требует усилий со стороны программиста. Просто выберите нужный объект СОМ на вкладке СОМ диалогового окна ссылок, и с ним можно будет работать как с классом .NET. Для этого IDE читает библиотеку типов СОМ и создает для объекта вспомогательный класс ("обертку") .NET. Открытыми членами этого класса являются все открытые члены объекта СОМ. Кстати, технология IntelliSense работает и для экземпляров этих классов.

Примечание
Классы объектов СОМ также создаются утилитой tlbimp.exe, входящей в .NET SDK. В частности, эта утилита удобна при одновременном построении нескольких "оберток" для использования в будущем
.

Вызовы функций DLL

Хотя при вызове функций DLL можно использовать старый синтаксис Declare, в .NET рекомендуется использовать другой способ – атрибут Dll Import, позволяющий создавать общие точки входа. Для этого в программе определяется пустая функция, совпадающая по сигнатуре с вызываемой функцией. Ниже приведен пример использования атрибута Dll Import.

Imports System.Drawing
Imports System.Runtime.InteropServices
Module Modulel
' Импортировать функцию CreateDC из Win32 API
<Dll Import("gdi32.dll")>
Public Function CreateDC(ByVal strDhver _
As String. ByVal strDeviceName As String,_
ByVal strOutput As String. ByVal nullDEVICE As Integer _)
As 'IntPtr
End Function
Sub Main()
' Создать прямоугольник
Dim rctWindow As Rectangle = New Rectangle(100, 100, 200, 200)
Dim penBlack As Pen = New PerUColor.Black)
penBlack.Brush = Brushes.DarkKham
Dim grfx As Graphics
Dim hDC As IntPtr = CreateDC("DISPLAY" .vbNullString,
vbNullString .vbNullString)
grfx = Graphics.FromHdc(hDC)
Do While (True)
grfx.FillRectangle(penBlack.Brush, rctWindow)
System.Threading.Thread.Sleep(0)
Loop
End Sub
End Module

Другое принципиальное отличие атрибута Dll Import от ключевого слова Declare заключается в том, что Dll Import позволяет лучше управлять отдельными аспектами вызова. В частности, при вызове функции можно указать конвенцию передачи параметров, и кодировку для передачи строковых параметров.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.