Подключение STGeomFile.dll
С помощью STGeomFile.dll осуществляется доступ к интерфейсу ISTGeomFiler. Библиотека расположена в составе Дополнения (см. Файлы дистрибуции). Также понадобятся два TLB-файла — они описывают интерфейсы (ISTGeomFiler, ISTGeomReceiver) и перечисления, что даёт типизированный доступ к API:
STGeomApiTypes.tlb;STTypes.tlb.
Библиотека экспортирует функцию CreateGeomFiler, которая возвращает ссылку на интерфейс ISTGeomFiler.
Пример загрузки библиотеки.
[DllImport("kernel32.dll")]
public static extern IntPtr LoadLibrary(string dllToLoad);
[DllImport("kernel32.dll")]
public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);
[DllImport("kernel32.dll")]
public static extern bool FreeLibrary(IntPtr hModule);
// Сигнатура экспортируемой функции CreateGeomFiler
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private delegate ISTGeomFiler TCreateGeomFiler();
private IntPtr hDLL;
protected ISTGeomFiler sgf; // формирование файла: StartFile / CloseFile (см. «Формирование файла SGF»)
protected ISTGeomReceiver sgr; // запись геометрии: методы в разделах геометрии и далее
public bool ConnectToGeomFiler(string DLLPath)
{
hDLL = IntPtr.Zero;
sgf = null;
sgr = null;
// освобождает уже захваченные ресурсы и сигнализирует о неудаче
bool Fail()
{
sgr = null;
sgf = null;
if (hDLL != IntPtr.Zero) { FreeLibrary(hDLL); hDLL = IntPtr.Zero; }
return false;
}
try
{
if (!File.Exists(DLLPath))
return Fail();
hDLL = LoadLibrary(DLLPath);
if (hDLL == IntPtr.Zero)
return Fail();
IntPtr pCreateGeomFiler = GetProcAddress(hDLL, "CreateGeomFiler");
if (pCreateGeomFiler == IntPtr.Zero)
return Fail();
var CreateGeomFiler = (TCreateGeomFiler)Marshal.GetDelegateForFunctionPointer(
pCreateGeomFiler, typeof(TCreateGeomFiler));
sgf = CreateGeomFiler();
if (sgf == null)
return Fail();
// тот же объект отдаёт интерфейс записи геометрии (в C# QueryInterface — это приведение типа)
sgr = sgf as ISTGeomReceiver;
if (sgr == null)
return Fail();
return true;
}
catch
{
return Fail();
}
}
Таким образом, sgf и sgr — это один и тот же COM-объект (см. Интерфейсы импорта).