Библиотека DDEML представляет собой 32-разрядную библиотеку платформы Win32. Ее функции не могут быть вызваны непосредственно из приложения .NET. Для того, чтобы иметь возможность работать с этой библиотекой, нужно создать ее «отображение» в среде .NET, используя специальные средства. Таким образом, типы и структуры, с которыми работает библиотека будут автоматически преобразовываться средствами .NET в типы .NET и наоборот. Для доступа к функциям используется класс DLLImportAttribute, который описан в пространстве имен System.Runtime.InteropServices. Что касается типов параметров функций, как уже было сказано, среда .NET в большинстве случаев автоматически осуществляет все необходимые преобразования. В таблице 1 показаны подобные преобразования:
Win32 | .NET |
DWORD | uint |
HCONV | IntPtr |
HSZ | IntPtr |
UINT | uint |
DWORD * | ref uint |
void* far | IntPtr или можно указать [Out] byte[], где [Out] – класс System.Runtime.InteropServices, который организовывает передачу данных от вызываемого объекта к вызывающему. |
Для функции обратного вызова необходимо создать делегат, который имеет соответствующую сигнатуру, и указать его в качестве параметра в функции DdeInitialize:
/// <summary>
/// Делегат функции обратного вызова DDE
/// </summary>
internal delegate IntPtr DDECallBackDelegate(
uint wType, // Код транзакции
uint wFmt, // Формат данных
IntPtr hConv, // Идентификатор канала
IntPtr hsz1, // Идентификатор строки (в нашем случае, строки раздела)
IntPtr hsz2, // Идентификатор строки (в нашем случае, элемента данных)
IntPtr hData, // Идентификатор глобальной области данных, где находятся данные