Конференция ".Net" » Win32 Dll в .Net приложении [D2005, WinXP]
 
  • Б.А.С. © (02.01.07 18:23) [0]
    В 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?
  • Джо © (03.01.07 05:02) [1]
    string в Делфи и string в .Net — две большие разницы.
  • Б.А.С. © (03.01.07 12:53) [2]
    В книге про string и string.net говорится, что можно использовать string или stringBuilder. Пробывал и то и другое - не получается.
  • DiamondShark © (03.01.07 17:08) [3]
    ещё раз.
    Дельфёвый стринг не имеет никакого отношения к дотнетному стрингу.
    Дотнетный PI-маршаллер понятия не имеет о дельфёвом стринге.

    Вывод:
    либо переписать функцию, используя типы, поддерживаемые PI,
    либо, если исходный текст недоступен, написать native-обёртку, а её уже использовать через PI.

    -----
    PI == Platform Invoke
  • Б.А.С. © (05.01.07 21:03) [4]
    Проблема решена при помощи функций работы с WMI пространства имен System.Managment.
  • UnDISCOvery (02.02.09 15:03) [5]
    Други!
    А можно взглянуть на кусок работающаго кода?
    У меня похожая проблема

    И еще вопрос: мне нужно обменяться строками из Дельфи.Нет вэб-сервиса с Вин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. }
  • UnDISCOvery (02.02.09 18:07) [6]
    Сделал - через StringBuilder
 
Конференция ".Net" » Win32 Dll в .Net приложении [D2005, WinXP]
Есть новые Нет новых   [118626   +16][b:0][p:0]