(C#)вопрос

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by csrss, 25 Oct 2009.

  1. csrss

    csrss Member

    Joined:
    13 Apr 2009
    Messages:
    38
    Likes Received:
    38
    Reputations:
    4
    Такой вопрос: моя либа експортирует следующуйю функцию:

    Code:
    DWORD myfunction(PULONG number, PULONG sramber); 
    с тем что 1ый аргумент ето число, 2ой - таблица числ. Терь из
    C#-повской проги мне нада использовать ету функцию
    и я вапще без понятия как. Вот типа есть такой код:

    Code:
            [DllImport("C:\\Users\\Administrator\\Desktop\\DLL\\DLL.dll", CharSet = CharSet.Auto)]
            public static extern UInt32 myfunction(
                out UInt32 number,
    	out UInt32[] sramber,
                );
    Code:
    UInt32 nr = new UInt32();
    UInt32[] tbl = new UInt32[256];
    myfunction(out nr, out tbl);
    после вызова myfunction - application crash.
    Кароче я без понятия как ето реализовать :(
     
  2. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    Не имеет смысла инициализировать переменные, которые передаются в метод с модификатором out.
    Передавать нужно скорее всего по ref.
     
  3. csrss

    csrss Member

    Joined:
    13 Apr 2009
    Messages:
    38
    Likes Received:
    38
    Reputations:
    4
    да переменные можно вообще не инициализировать, тут не в том дело. Тут ни с ref ни с out нет никакой возможности вытащить из функции таблицу =( Может еще попробовать загнать ето в IntPtr и от туда конверт в UInt32 / UInt64 но ето мне кажетса уже извращенством =/.

    Edit: кароче C# ето редкостное де*мо и ни хрена с ним невозможно сделать. Поворот обратно к managed c++ .NET.
     
    #3 csrss, 26 Oct 2009
    Last edited: 26 Oct 2009
  4. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    бздец, не гони на язык, пиши нормальным русским языком, либо п**уй в школу обратно.
    по сабжу.

    DWORD myfunction(PULONG number, PULONG sramber);

    [DllImport("c:\\temp.dll", SetLastError = true)]
    public static extern int myfunction(ref int number, ref int sramber)
     
    #4 W!z@rD, 26 Oct 2009
    Last edited: 26 Oct 2009
  5. csrss

    csrss Member

    Joined:
    13 Apr 2009
    Messages:
    38
    Likes Received:
    38
    Reputations:
    4
    Как на C# не гнать, ну как скажи? Вот банальный пример когда C# обламываетса:

    вот длл откомпиленная при помощи GCC, и какого у неё в зависимостях либы от internet explorer? я конешно не знаю

    [​IMG]

    C# сразу выбрасывает dll not found exception если попробуеш её заимпортировать. В случае с WinAPI (C/C++) - никакого гемора нет.
    Я ессно знаю что можно пытатся добавлять все эти зависимости в PATH Environment Variable, etcetera. Может сразу целый program files добавить?

    А по сабжу, тут ни out ни ref, тут нужно по ходу с IntPtr & GCHandle возиться, но это еще не проверял так как у меня тут утро тока щас.
    P.S. Вообще откуда у тебя идея меня отправить в школу? xD
     
  6. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    судя по твоему знанию русского языка. =\

    References смотри, не добавляется ничего само собой.

    http://img20.imageshack.us/img20/9510/10262009210346.jpg
    либа собранная на .NET 3.5, 2008 студия.
     
  7. csrss

    csrss Member

    Joined:
    13 Apr 2009
    Messages:
    38
    Likes Received:
    38
    Reputations:
    4
    <offtop>
    Я из россии сматал 13 лет назад, так что общаюсь как могу уж =/

    Вобщем там с длл трабла была в возвращении MessageBox в одном месте в случае ошибки. От туда и сотня разных зависимостей появилась. Но всё равно, ИМХО, реализация DLLImport намного позади стандартных LdrLoadDll && LdrGetProcedureAddress || LoadLibraryEx && GetProcAddress
    </offtop>

    Вобщем намутил я следующее:

    Code:
    int[] Table = new int[256];
    GCHandle handle= GCHandle.Alloc(Table, GCHandleType.Pinned);
    IntPtr TableHandle= handle.AddrOfPinnedObject();
    int Number;
    int Status = myfunction(TableHandle, out Number);
    
    Всё равно еще оно не то, но кажетса что уже ближе. Кароч буду дальше пробовать.
     
    #7 csrss, 26 Oct 2009
    Last edited: 26 Oct 2009
  8. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    Так C# не для этих дел :)
    Я вообще не вижу необходимости импортировать что-то из нативного кода. Из всего что может понадобиться - 99% есть во фреймворке. А нативный код для сишарпа чужеродный, оттого и проблемы у тебя, что ты его вместо си пытаешся использовать.
     
  9. csrss

    csrss Member

    Joined:
    13 Apr 2009
    Messages:
    38
    Likes Received:
    38
    Reputations:
    4
    В C# я уже и так минимум пробую реализовать. Просто нужно сделать ГУИ в чем-то, а поскольку в C# & visual studio 2008 это от силы занимает пол часа вот я и взялся а теперь мучаюсь. Топик исчерпан в принципе.
     
  10. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    возьми проимпортируй LoadLibrary и т.п.

    А вообще не надо задачу подстраивать под инструмент.