Сейчас на форуме: bartolomeo, vasilevradislav, rmn, Magister Yoda (+7 невидимых)

 eXeL@B —› Программирование —› проблема с shared-memory
Посл.ответ Сообщение

Ранг: 2.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 19 декабря 2008 07:59
· Личное сообщение · #1

Имеется С# приложение и С++ кодес, который получает из последнего параметры.
Решил сделать через shared-секцию в общей DLL, которую будет импортировать и тот и другой код:

// shrd.dll
#pragma data_seg("Shared")
volatile BOOL g_Once = FALSE;
#pragma data_seg()

__declspec(allocate("Shared")) volatile BOOL fvars[FVAR_NUM];
#pragma comment(linker, "/SECTION:Shared,RWS")

// C# app
unsafe class ShrdMethods
{ [DllImport("shrd.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int GetVariable(int varnum);
...

и обычный C-код с LoadLibrary/GetProcAddress.

Обычный C-код (как и любое другое non-managed приложение, если податтачить туда руками общую либу) после загрузки shrd.dll видит эту секцию. C#-код, который загружает себе shrd.dll имеет )) ее изолированно, т.е. shared-секция не разделяется. Самое интересное, что на одной системе это так, на другой (не могу представить какие должны быть отличия, возможно разные версии framework-a? Oo) всё прекрасно работает, т.е. как C#, так и C код прекрасно видят общие данные.

что не так? если проблема нерешаема, как еще грамотно разделить данные в памяти, чтобы этой проблемы не было?
thx.




Ранг: 170.1 (ветеран), 96thx
Активность: 0.090.01
Статус: Участник

Создано: 19 декабря 2008 10:55
· Личное сообщение · #2

deL1ght пишет:
разделить данные в памяти

А просто открыть из обоих приложений MMF-файл с тем же именем не подойдет?



Ранг: 2.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 19 декабря 2008 11:06
· Личное сообщение · #3

gazlan
да, думал..
Но ведь будет использоваться тот же механизм, выделение памяти с SHARED-атрибутом??
Т.е. получается тут разница только в том, как это сделать... или через объявление секции в DLL или через API, думаю резалт будет аналогичный =((




Ранг: 170.1 (ветеран), 96thx
Активность: 0.090.01
Статус: Участник

Создано: 19 декабря 2008 13:15 · Поправил: gazlan
· Личное сообщение · #4

deL1ght пишет:
тот же механизм

Но не осложненный флагами и опциями линкера и версиями фрэймворка.
Кроме того файл - объект ядра, т.е. не связан с адресным пространством приложения.



Ранг: 2.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 19 декабря 2008 13:43
· Личное сообщение · #5

спс, с MMF попробую.

какие еще возможны варианты?
реестр и общий файл на харде не подходит, должно работать с ограниченными правами...




Ранг: 260.9 (наставник)
Активность: 0.120
Статус: Участник
John Smith

Создано: 19 декабря 2008 17:34 · Поправил: Rascal
· Личное сообщение · #6

пайпы. мсдн читани на предмет пайпов, найдешь все аналогичные механизмы
еще вспомнил такую тему как DDE
зы: ячтоб работать с маппингом совсем не обязательно создавать файл на диске. именованный мапинг пашет прекрасно без файлов.

-----
Недостаточно только получить знания:надо найти им приложение



 eXeL@B —› Программирование —› проблема с shared-memory
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати