Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Как вызвать не .NET функцию по указателю


Автор: stab 22.2.2003, 18:27
[DllImport("kernel32", SetLastError=true)]
static extern uint LoadLibrary(string name);

[DllImport("kernel32", SetLastError=true)]
static extern IntPtr GetProcAddress(uint hLib, string name);

[DllImport("kernel32", SetLastError=true)]
static extern bool FreeLibrary(uint hLib);


.....


uint hLib = LoadLibrary("user32");
IntPtr ip = GetProcAddress(hLib, "MessageBoxA");

// и чего делать с ip не понятно

FreeLibrary(hLib);


может как-то можно засунуть в делигат?

Автор: AntonSaburov 25.2.2003, 18:42
Я видел вот такой вариант - может он более интересен.

Сначала можно сделать обертку

internal class Wrapper
{
[DllImport("kernel32.dll")]
public static extern int CreateFile(String lpFileName, uint dwDesiredAccess,
uint dwShareMode, SecurityAttributes attr,
uint dwCreationDisposition,
uint dwFlagsAndAttributes, uint hTemplateFile);
}

А потом вызывать

byte[] _numReadWritten = new byte[4];

byte[] intBytes = new byte[4];
byte[] msgBytes = null;
int len;

bool fOk = Wrapper.ReadFile(_handle, intBytes, 4, _numReadWritten, 0);
if (fOk)
{
...
}

Автор: stab 27.2.2003, 18:40
спасибо, но первый вариант от второго ни чем не отличается, мне нужно именно динамическое связывание. У мя старые DLL есть, каждая за свой формат файлов отвечает (как в ACDSee), заранее набор этих DLL не известен, т.е. надо делать LoadLibrary, GetProcAddress. Можно конечно каждую DLL завернуть в класс, но может и без этого обойтись можно?

Автор: AntonSaburov 27.2.2003, 19:00
Насколько я понимаю идеологию NET - не получится.
Надо написать COM-обертку вокруг DLL и вот ее уже можно динамически подключать.

Хотя если вдруг найдется информация, что такое возможно - не скрывай такой радости для программистов smile.gif

Автор: desyatnik 1.3.2003, 21:47
Цитата(AntonSaburov @ 27.2.2003, 19:00)
Насколько я понимаю идеологию NET - не получится.
Надо написать COM-обертку вокруг DLL и вот ее уже можно динамически подключать.

А может, попробовать использовать не COM, а unsafe-режим C#? Я в него не вникал, но что-то по манипуляции с указателями там есть.

Автор: stab 4.3.2003, 21:01
Эх, манипуляции-то с указателями есть, а вот вызовов функций по указателям нет sad.gif

Автор: AntonSaburov 4.3.2003, 21:14
Я тоже посмотрел - нет там ничего такого.

Автор: simanyay 4.3.2003, 22:19
В принципе я читал в одной книге, можно это сделать - но получиться такой гемор, что лучше даже не пробовать sad.gif Там описываются ТАКИЕ ухищрения, что, я считаю, лучше написать всё по новой... А исходники библиотек есть?

Автор: stab 6.3.2003, 07:38
Цитата
А исходники библиотек есть?


не всех

Цитата
В принципе я читал в одной книге ...


что за книга? или хоть принцип?

Автор: simanyay 6.3.2003, 22:55
Две книги - Переход на VB .NET (сразу скажу, книга не очень, хотя некоторые идеи ничего)

И вторая, это... не помню названия - там на обложке разработчики нарисованы. Не моя просто была.

Автор: stab 9.3.2003, 23:34
simanyay а что все-таки за принцип? smile.gif

Автор: Мурлыкатам_ 6.7.2008, 02:30
Внатуре, давайте капнем!

Автор: Voyager 7.7.2008, 13:58
Давай. smile
Только там капать особо не надо, объявляется делегат функции, через Marshal.GetDelegateForFunctionPointer идет его получение и вперед.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)