Если вы хотите подойти со стороны COM, тестирование COM-объектов в DLL сводится к поиску экспорта с именем "DllGetClassObject". Это связано с тем, что доступ к COM-объекту внутри процесса осуществляется из среды выполнения COM путем вызова DllGetClassObject () для этой DLL.
Вы можете сделать это из командного файла, используя DUMPBIN.EXE , который поставляется с Visual Studio следующим образом:
dumpbin unknown.dll /exports | find "DllGetClassObject"
Приведенная выше командная строка выдаст одну строку текста, если это неуправляемая DLL, которая содержит COM-объекты, или ноль байтов вывода в противном случае.
Вы можете сделать это программно, загрузив каждую DLL и попытаться выполнить GetProcAddress () в этой точке входа. Вот проверенная и работающая программа командной строки C #, которая использует эту технику:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
static class NativeStuff
{
[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);
}
namespace IsComDLL
{
class Program
{
static void Main(string[] args)
{
if ( (args.Length == 0 ) || String.IsNullOrEmpty( args[0] ) )
{
Console.WriteLine( "Give DLL name on command line" );
Environment.Exit(255);
}
IntPtr pDll = NativeStuff.LoadLibrary(args[0]);
if ( pDll == IntPtr.Zero )
{
Console.WriteLine( "DLL file {0} not found", args[0] );
Environment.Exit(256);
}
IntPtr pFunction = NativeStuff.GetProcAddress(pDll, "DllGetClassObject");
int exitValue = 0;
if (pFunction == IntPtr.Zero)
{
Console.WriteLine("DLL file {0} does NOT contain COM objects", args[0]);
}
else
{
Console.WriteLine("DLL file {0} does contain COM objects", args[0]);
exitValue = 1;
}
NativeStuff.FreeLibrary(pDll);
Environment.Exit(exitValue);
}
}
}