-
В DLL Win32 описана функция function GetMacFromIP(const IP: string): string; stdCall. (Использовал string а не PChar. В программе Win32 все работает именно со string.) В программе .Net подключаюсь к функции:
{$unsafecode on} [DLLImport('GetMAC.dll', EntryPoint='GetMacFromIP', charset=CharSet.Auto, CallingConvention=CallingConvention.StdCall)] function GetMacFromIP(const IP: string): string;external; unsafe;
или так
[DLLImport('GetMAC.dll', EntryPoint='GetMacFromIP', charset=CharSet.Ansi, CallingConvention=CallingConvention.StdCall)] function GetMacFromIP(const IP: string): string;external;
Но при вызове функции возникает ошибка "В экземпляре объекта не задана ссылка на объект"
Что же я делаю не так? Как мне запустить эту функцию в .Net?
-
string в Делфи и string в .Net — две большие разницы.
-
В книге про string и string.net говорится, что можно использовать string или stringBuilder. Пробывал и то и другое - не получается.
-
ещё раз. Дельфёвый стринг не имеет никакого отношения к дотнетному стрингу. Дотнетный PI-маршаллер понятия не имеет о дельфёвом стринге.
Вывод: либо переписать функцию, используя типы, поддерживаемые PI, либо, если исходный текст недоступен, написать native-обёртку, а её уже использовать через PI.
----- PI == Platform Invoke
-
Проблема решена при помощи функций работы с WMI пространства имен System.Managment.
-
Други! А можно взглянуть на кусок работающаго кода? У меня похожая проблема
И еще вопрос: мне нужно обменяться строками из Дельфи.Нет вэб-сервиса с Вин32-длл написаной на Дельфи. Доступ к коду длл есть. Какой минимально геморойный способ обмена строкамит в таком случае? Ведь никто не отменял в длл :
{ Important note about DLL memory management: ShareMem must be the first unit in your library's USES clause AND your project's (select Project-View Source) USES clause if your DLL exports any procedures or functions that pass strings as parameters or function results. This applies to all strings passed to and from your DLL--even those that are nested in records and classes. ShareMem is the interface unit to the BORLNDMM.DLL shared memory manager, which must be deployed along with your DLL. To avoid using BORLNDMM.DLL, pass string information using PChar or ShortString parameters. }
-
Сделал - через StringBuilder
|