Маппинг и Терминал Сессии

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

student-uni
Бывалый
Бывалый
 
Сообщения: 242
Зарегистрирован: 01.10.2005 (Сб) 18:54

Маппинг и Терминал Сессии

Сообщение student-uni » 10.10.2006 (Вт) 18:19

Использую Маппинг для обмена данными между программами.

Всё замечательно работает на локальной машине и в пределах одной сессии.

Но если я запускаю копии программы в разных тероминал сессиях (на Windows SErver 2003)- данные почему то не передаются.

И это логично. Объект файлового отображения связан со страничным СВАП-файлом. И видимо каждая терминал сессия имеет свой СВАП.

Вопрос: а какже обойти эту проблему ?

Код прилагается

Спасибо всем сочуствующим.

Код: Выделить всё

' декларируем АПИ CreateFileMapping

Private Declare Function CreateFileMapping Lib "kernel32" Alias "CreateFileMappingA" (ByVal hFile As Integer, ByVal lpFileMappigAttributes As Integer, ByVal flProtect As Integer, ByVal dwMaximumSizeHigh As Integer, ByVal dwMaximumSizeLow As Integer, ByVal lpName As String) As Integer

Private Declare Function MapViewOfFile Lib "kernel32" Alias "MapViewOfFile" (ByVal hFileMappingObject As Integer, ByVal dwDesiredAccess As Integer, ByVal dwFileOffsetHigh As Integer, ByVal dwFileOffsetLow As Integer, ByVal dwNumberOfBytesToMap As Integer) As IntPtr


' декларируем констатнты

Private Const PAGE_READWRITE As Integer = &H4
Private Const INVALID_HANDLE_VALUE As Integer = -1

' декларируем переменные

Private FileHandle As Integer ' это хэндл
Private SharePoint As IntPtr ' а это указатель на наше будущее место в памяти

Dim MemoryName As String ="MySharedMemory"
' имя области которую будем потом искать

FileHandle = CreateFileMapping(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, 128, MemoryName)


' Получаем указатель на это место в памяти

        If Not FileHandle = 0 Then
            SharePoint = MapViewOfFile(FileHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0)
        Else
            Return False
        End If

' Теперь любая программа которая "знает" имя области -"MySharedMemory" - может получить этот адрес и следовательно читать/писать туда.



tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Маппинг и Терминал Сессии

Сообщение tyomitch » 10.10.2006 (Вт) 21:16

student-uni писал(а):Использую Маппинг для обмена данными между программами.

Всё замечательно работает на локальной машине и в пределах одной сессии.

Но если я запускаю копии программы в разных тероминал сессиях (на Windows SErver 2003)- данные почему то не передаются.

И это логично. Объект файлового отображения связан со страничным СВАП-файлом. И видимо каждая терминал сессия имеет свой СВАП.

Неа, не угадал. Своп один на всех.

MSDN писал(а):Terminal Services: The name can have a "Global\" or "Local\" prefix to explicitly create the object in the global or session name space. The remainder of the name can contain any character except the backslash character (\). For more information, see Kernel Object Name Spaces.
Изображение

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 11.10.2006 (Ср) 14:04

На правах прохожего:

Обменяться данными в NET проще связкой Remoting+IPC канал
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

student-uni
Бывалый
Бывалый
 
Сообщения: 242
Зарегистрирован: 01.10.2005 (Сб) 18:54

Сообщение student-uni » 14.10.2006 (Сб) 23:46

Declare Function CreateFileMapping& Lib "kernel32" Alias "CreateFileMappingA" _
(ByVal hFile As Long, lpFileMappingAttributes As SECURITY_ATTRIBUTES, ByVal _
flProtect As Long, ByVal dwMaximumSizeHigh As Long, ByVal dwMaximumSizeLow As _
Long, ByVal lpName As String)


Parameter Type/Description
hFile Long — A file handle to a file on which to create the mapping. &HFFFFFFFF& to create a file mapping on memory.





Код: Выделить всё
Private Const INVALID_HANDLE_VALUE As Integer = -1


Выходит я создаю мапинг в РАМе ?
Ну оперативки то в терминал сессии разные ?
Помогите разобраться пожалуйста

student-uni
Бывалый
Бывалый
 
Сообщения: 242
Зарегистрирован: 01.10.2005 (Сб) 18:54

Сообщение student-uni » 15.10.2006 (Вс) 1:51

похоже так и есть

заменил INVALID_HANDLE_VALUE =-1 на хэндл созданного мною файла

Теперь инфа пишется не в РАМ а в этот файл

В терминальных сессиях пока не проверял, но надеюсь будет работать

вот только ещё небольшое ругательство, не поможетет разобраться

на

FileHandle2 = MyFileStream.Handle

Пишет

Warning 1 'Public Overridable ReadOnly Property Handle() As System.IntPtr' is obsolete: 'This property has been deprecated. Please use FileStream's SafeFileHandle property instead.

А как мне SafeFileHandle использовать , мне же номер хэндла нужен
а SafeFileHandle его не возвращает

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.10.2006 (Вс) 17:35

student-uni, ты первый ответ читал? ;-)
Изображение

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 15.10.2006 (Вс) 18:35

А как мне SafeFileHandle использовать , мне же номер хэндла нужен

так и используй
Код: Выделить всё
Dim FileHandle2 As SafeFileHandle = MyFileStream.SafeFileHandle

и исправь в обьявлении.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

student-uni
Бывалый
Бывалый
 
Сообщения: 242
Зарегистрирован: 01.10.2005 (Сб) 18:54

Сообщение student-uni » 15.10.2006 (Вс) 18:36

Читал, но не совсем понял.

Это что же получается всё зависит от этого Префикса ?

Т.е если Терминал работает Глобал - то я смогу передавать данные между терминальными сессиями,
а если Локал - то нет ?

Но тогда почему это так ?

Я до этого маппинга передавал данные через базу данных.
Всё работало.

Потом с маппингом в РАМ наблюдалась вышеприведенная картина (в пределах сессии работает, между сессиями - нет.

Сейчас я переписал маппинг так чтоб отображать не в РАМ а в файл на диске. (Это почти то же самое что и через БД)
Думаю должно работать. В понедельник проверю - расскажу.

Если я тебя не правильно понял - поясни пожалуйста

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 15.10.2006 (Вс) 18:48

Но тогда почему это так ?
Что бы сервисы из разных терминальных сессий не мешали друг другу если их разработчики вдруг не предусмотрели возможности использования двух сессий.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

student-uni
Бывалый
Бывалый
 
Сообщения: 242
Зарегистрирован: 01.10.2005 (Сб) 18:54

Сообщение student-uni » 15.10.2006 (Вс) 18:58

2 Nord777

я так и сделал

Там нет номера Хэндла только логические проверки существует или нет

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 15.10.2006 (Вс) 19:15

что то я не понимаю зачем тебе хэндл? передавай в качестве аргумента SafeFileHandle.
Если спрашиваешь для интереса, то хендл содержится в базовом классе. Получено Рефлектором:
Код: Выделить всё
Public NotInheritable Class SafeFileHandle
      Inherits SafeHandleZeroOrMinusOneIsInvalid
      ....
End Class

Public MustInherit Class SafeHandleZeroOrMinusOneIsInvalid
      Inherits SafeHandle
      ....
End Class

Public MustInherit Class SafeHandle
    Inherits CriticalFinalizerObject
    Implements IDisposable
    ....
    Protected handle As IntPtr
End Class
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

student-uni
Бывалый
Бывалый
 
Сообщения: 242
Зарегистрирован: 01.10.2005 (Сб) 18:54

Сообщение student-uni » 15.10.2006 (Вс) 19:21

Declare Function CreateFileMapping& Lib "kernel32" Alias "CreateFileMappingA" _
(ByVal hFile As Long, lpFileMappingAttributes As SECURITY_ATTRIBUTES, ByVal _
flProtect As Long, ByVal dwMaximumSizeHigh As Long, ByVal dwMaximumSizeLow As _
Long, ByVal lpName As String)

в CreateFileMapping Первый аргумент - номер Хэндла - > Инт -> Число мне туда вставить надо

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 15.10.2006 (Вс) 19:31

из того же Рефлектора:

Friend Shared Function CreateFileMapping(ByVal hFile As SafeFileHandle, ByVal lpAttributes As IntPtr, ByVal fProtect As UInt32, ByVal dwMaximumSizeHigh As UInt32, ByVal dwMaximumSizeLow As UInt32, ByVal lpName As String) As SafeFileMappingHandle

Declaring Type: Microsoft.Win32.Win32Native
Assembly: mscorlib, Version=2.0.0.0

-----------------------------------------------------------
Friend Shared Function CreateFileMapping(ByVal hFile As IntPtr, ByVal lpFileMappingAttributes As SECURITY_ATTRIBUTES, ByVal flProtect As Integer, ByVal dwMaximumSizeHigh As Integer, ByVal dwMaximumSizeLow As Integer, ByVal lpName As String) As SafeFileMappingHandle

Declaring Type: Microsoft.Win32.NativeMethods
Assembly: System, Version=2.0.0.0
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.10.2006 (Вс) 19:48

student-uni писал(а):Читал, но не совсем понял.

Это что же получается всё зависит от этого Префикса ?

Т.е если Терминал работает Глобал - то я смогу передавать данные между терминальными сессиями,
а если Локал - то нет ?

Но тогда почему это так ?

Господи-боже.
Просто замени "MySharedMemory" на "Global\MySharedMemory".
И всё.
Изображение

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 16.10.2006 (Пн) 10:18

в CreateFileMapping Первый аргумент - номер Хэндла - > Инт -> Число мне туда вставить надо


Судя по долгому молчанию я понял что ты не понял :wink:
Сделай два обьявления функции 'CreateFileMapping ' c разными параметрами - одну с интегером другую с SafeFileHandle и передавай то что нужно.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

student-uni
Бывалый
Бывалый
 
Сообщения: 242
Зарегистрирован: 01.10.2005 (Сб) 18:54

Сообщение student-uni » 16.10.2006 (Пн) 14:07

Спасибо работает Global\MySharedMemory
правда нужно в терминальнои сессии запустить программу от имени одинаковых учетных записеи винды. Но ето мелочи. Еше раз спасибо. Помогли

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.10.2006 (Пн) 20:39

student-uni писал(а):Спасибо работает Global\MySharedMemory
правда нужно в терминальнои сессии запустить программу от имени одинаковых учетных записеи винды. Но ето мелочи. Еше раз спасибо. Помогли

Как полезно иногда бывает читать ответы ;-)
Изображение


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 97

    TopList