Re: Как это изобразить на С#?
От: Visor2004  
Дата: 25.06.13 07:50
Оценка: 3 (1)
Здравствуйте, mDmitriy, Вы писали:

D>Подскажите, плиз, как написать эту структуру и функции для интерфейса на C#.


[StructLayout(LayoutKind.Sequential)]
struct MenuItem
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 255)]
byte[] stName;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 255)]
byte[] stItem;
}
Помните!!! ваш говнокод кому-то предстоит разгребать.
Как это изобразить на С#?
От: mDmitriy Россия  
Дата: 24.06.13 15:03
Оценка:
Всем привет!

В общем, есть приложение, которое может работать с самописными плагинами как с COM-объектами.

На С++ работающий интерфейс плагина выглядит так:
struct MenuItem
{
    char stName[255];
    char stItem[255];
};

__declspec(dllexport) int __stdcall Init(void * value)
__declspec(dllexport) bool __stdcall MenuItem(char const * stFunction, IPlugin * IP)


На Дельфи так:
TAddMenu = record
    stName: array [0..MAX_TEXT_LENGTH-1] of AnsiChar;
    stItem: array [0..MAX_TEXT_LENGTH-1] of AnsiChar;
end;

function Init(AValue: Pointer): Integer;
function MenuItem(AFunction: PAnsiChar; APlugin: IPlugin): Boolean;

Подскажите, плиз, как написать эту структуру и функции для интерфейса на C#.
Re: Как это изобразить на С#?
От: HowardLovekraft  
Дата: 25.06.13 10:10
Оценка:
Здравствуйте, mDmitriy, Вы писали:

D>На С++ работающий интерфейс плагина выглядит так:

Не понятно, откуда этот кусок кода.
Если это — сам плагин, то наличие экспортируемых функций наводит на мысль о том, что это вовсе не COM, а обычная DLL, с которой работают через LoadLibrary/GetProcAddress, кроме того, непонятно, что такое IPlugin тогда.
Если это хост-приложение, то не понятно, кто, когда и как вызывает у него Init и MenuItem.
Re[2]: Как это изобразить на С#?
От: mDmitriy Россия  
Дата: 25.06.13 10:34
Оценка:
Здравствуйте, Visor2004, Вы писали:

V>Здравствуйте, mDmitriy, Вы писали:


D>>Подскажите, плиз, как написать эту структуру и функции для интерфейса на C#.


V>[StructLayout(LayoutKind.Sequential)]

Спасибо большое
А функции?
Re[2]: Как это изобразить на С#?
От: mDmitriy Россия  
Дата: 25.06.13 11:06
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

HL>Здравствуйте, mDmitriy, Вы писали:


D>>На С++ работающий интерфейс плагина выглядит так:

HL>Не понятно, откуда этот кусок кода.
Из примера
HL>Если это — сам плагин, то наличие экспортируемых функций наводит на мысль о том, что это вовсе не COM, а обычная DLL, с которой работают через LoadLibrary/GetProcAddress,
Это вполне может быть.
HL>кроме того, непонятно, что такое IPlugin тогда.
IPlugin — это один из интерфейсов приложения, описан в имеющейся tlb.
HL>Если это хост-приложение, то не понятно, кто, когда и как вызывает у него Init и MenuItem.
MenuItem — просто структура. Указатель на массив таких структур передается через параметр функции Init. Вызывает ее приложение в момент подключения плагина.
Re[3]: Как это изобразить на С#?
От: HowardLovekraft  
Дата: 25.06.13 13:06
Оценка:
Здравствуйте, mDmitriy, Вы писали:

D>IPlugin — это один из интерфейсов приложения, описан в имеющейся tlb.

Так а кто вызывает MenuItem и передает туда реализацию IPlugin?
Получается, что хост-приложение умеет работать с плагинами двумя способами (как с COM-объектами и как с обычной DLL через вызов экспортируемых функций) и у вас пример, не имеющий отношения к работе с COM-плагинами? Тогда вопрос поставлен некорректно — нужен пример создания COM-плагина.
Re[3]: Как это изобразить на С#?
От: Visor2004  
Дата: 25.06.13 13:48
Оценка:
Здравствуйте, mDmitriy, Вы писали:

[DllImport("dllname.dll")]
public static extern int Init(IntPtr value);

[DllImport("dllname.dll", CharSet = CharSet.Ansi)]
public static extern bool MenuItem(string stFunction, ref IPlugin IP);
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re[4]: Как это изобразить на С#?
От: hardcase Пират http://nemerle.org
Дата: 25.06.13 14:14
Оценка:
Здравствуйте, Visor2004, Вы писали:

V>Здравствуйте, mDmitriy, Вы писали:


V>[DllImport("dllname.dll")]

V>public static extern int Init(IntPtr value);

V>[DllImport("dllname.dll", CharSet = CharSet.Ansi)]

V>public static extern bool MenuItem(string stFunction, ref IPlugin IP);

Эти функции ищет и в DLL-ке и вызвает хостовое приложение.
Т.е. чтобы поддержать плагины на C# автору топика придется научиться создавать через COM, либо поднимать CLR в своей софте.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[5]: Как это изобразить на С#?
От: Visor2004  
Дата: 25.06.13 19:18
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Эти функции ищет и в DLL-ке и вызвает хостовое приложение.

H>Т.е. чтобы поддержать плагины на C# автору топика придется научиться создавать через COM, либо поднимать CLR в своей софте.

ну, я же не в курсе какая там у него специфика, он попросил объявление функций, я ему написал
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re[4]: Как это изобразить на С#?
От: mDmitriy Россия  
Дата: 26.06.13 04:18
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

HL>Здравствуйте, mDmitriy, Вы писали:


D>>IPlugin — это один из интерфейсов приложения, описан в имеющейся tlb.

HL>Так а кто вызывает MenuItem и передает туда реализацию IPlugin?
MenuItem — просто структура, указатель на список которых передается в параметре функции Init.
HL>Получается, что хост-приложение умеет работать с плагинами двумя способами (как с COM-объектами и как с обычной DLL через вызов экспортируемых функций) и у вас пример, не имеющий отношения к работе с COM-плагинами? Тогда вопрос поставлен некорректно — нужен пример создания COM-плагина.
Других примеров, увы, нет... Может, COM-объект я зря сюда приплел, неверно поняв документацию.
Технология COM хост-приложением используется, но, может быть, не для плагинов, а плагины загружаются, как было предположено выше, через LoadLibrary/GetProcAddress.
Само хост-приложение написано на Delphi.
Re[5]: Как это изобразить на С#?
От: mDmitriy Россия  
Дата: 26.06.13 04:19
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Здравствуйте, Visor2004, Вы писали:


V>>Здравствуйте, mDmitriy, Вы писали:


V>>[DllImport("dllname.dll")]

V>>public static extern int Init(IntPtr value);

V>>[DllImport("dllname.dll", CharSet = CharSet.Ansi)]

V>>public static extern bool MenuItem(string stFunction, ref IPlugin IP);

H>Эти функции ищет и в DLL-ке и вызвает хостовое приложение.

H>Т.е. чтобы поддержать плагины на C# автору топика придется научиться создавать через COM, либо поднимать CLR в своей софте.
э-э... что значит — поднимать CLR?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.