• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Использование API Лоцмана в .Net на языке C#

Автор Vershkov, 03.05.12, 17:56:38

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Vershkov

var tp =Type.GetTypeFromCLSID(new Guid("{392BA982-A82F-44AB-BA8A-69BE25199F73}"), "ktpsrv");


string appProgID = "LoodsmanServerApplication.MainSystem";

_server = (MainSystem)Activator.CreateInstance(tp);
   
object errorCode = new object();
object errorMessage = new object();
string dbList = _server.GetDBList(errorCode, errorMessage);

var q =_server.ConnectToDB("KONSTR_DEMO", out errorCode, out errorMessage);
Loodsman.DataSet ds = new Loodsman.DataSet();
ds.DATA = _server.GetProjectListEx(true,out errorCode,out  errorMessage);


Результат отработки ConnectToDB
errorCode
202
errorMessage
Ошибка подключения к серверу баз данных [ktpsrv]!
Требуемый уровень олицетворения не обеспечен, или обеспеченный уровень неверен

Результат отработки GetProjectListEx
errorCode
2812
errorMessage
Не удалось найти хранимую процедуру "dbo.prGetAllProjects".

Насколько я понял я не правильно подключился к серверу хоту _server.GetDBList(errorCode, errorMessage) вернул правильные значения есть идеи?

z-arthur

Ошибка "Требуемый уровень олицетворения не обеспечен, или обеспеченный уровень неверен" связана с механизмом делегирования прав.
Для разрешения делегирования прав используйте WinAPI функцию CoInitializeSecurity: http://msdn.microsoft.com/en-us/library/windows/desktop/ms693736(v=vs.85).aspx

Пример того, как его использовать в Delphi здесь http://forum.ascon.ru/index.php/topic,19108.0.html

Vershkov

Остался только вопрос как это сделать в C# (.net) я пока не разобрался. Если кто то знает подскажите пожалуйста. Хотя бы  где копать. Очень не хочется делать это на Unmanaged C++

z-arthur

Цитата: Vershkov от 04.05.12, 17:18:28
Остался только вопрос как это сделать в C# (.net) я пока не разобрался. Если кто то знает подскажите пожалуйста. Хотя бы  где копать. Очень не хочется делать это на Unmanaged C++

Вот здесь http://pinvoke.net/default.aspx/ole32.CoInitializeSecurity описывается как вызвать CoInitializeSecurity. Хотя там же написано, что в c# не нужно вызывать CoInitializeSecurity, т.к. он вызывает при старте программы.

Vershkov

Спасибо.
Но не помогло ошибка всё та же. Есть у кого идеи и предложения(сменить среду реализации не предлагать).

z-arthur

У меня такая же ошибка появилась при разработке службы на .net.
Вы не решали эту проблему?

r_haritonov

Для тех кто наткнется поиском на эту тему.

Столкнулся почти с такой же проблемой. Приложение на VB.Net подключается по DCOM.

На Windows XP SP3 (32bit) все работало, а на Windows 7 (64 bit) при вызове
ConnectToDB(stDbName, errorCode, errorMessage)

появилась ошибка:
Код ошибки: 202
Текст ошибки: Ошибка подключения к серверу баз данных [ascon]! Неопознанная ошибка

В поддержке ответили, что нужно вызвать CoInitializeSecurity с определенными параметрами, но пример в ответе на Delphi.

Для .Net все-таки получилось обойти эту ошибку, учтя все нюансы, которые описаны по ссылке, которую выше уже давали:
http://pinvoke.net/default.aspx/ole32.CoInitializeSecurity

Что нужно сделать, на примере GUI приложения на VB.Net под Visual Studio 2010.
CoInitializeSecurity нужно вызывать на самой ранней стадии работы приложения, до создания формы
http://stackoverflow.com/questions/2849651/how-can-i-get-my-vb-net-forms-application-startup-method-to-be-sub-main-in-pro
В русской версии Настройки проекта -> Приложение -> Включить исполняющую среду (убрать галку)
Автоматически запускаемый объект -> Sub main

Нужно добавить файл, например MainApplication.vb, в котором будет непосредственно вызов CoInitializeSecurity и создание формы:

Imports System.Threading

Module MainApplication
    Declare Function CoInitializeSecurity Lib "ole32.dll" (ByVal pVoid As IntPtr, ByVal cAuthSvc As Integer, ByVal asAuthSvc As IntPtr, _
                                                           ByVal pReserved1 As IntPtr, ByVal dwAuthnLevel As Integer, ByVal dwImpLevel As Integer, _
                                                           ByVal pAuthList As IntPtr, ByVal dwCapabilities As Integer, ByVal pReserved3 As IntPtr) As Integer
    Sub main()
        System.Windows.Forms.Application.EnableVisualStyles()
        System.Threading.Thread.CurrentThread.SetApartmentState(ApartmentState.STA)
        CoInitializeSecurity(IntPtr.Zero, -1, IntPtr.Zero, IntPtr.Zero, 1, 4, IntPtr.Zero, 0, IntPtr.Zero)
        System.Windows.Forms.Application.Run(New MainForm())
    End Sub
End Module

И последний важный нюанс, для того чтобы CoInitializeSecurity не возвращала RPC_E_TOO_LATE при отладке, нужно отключить в настройках отладки

Visual Studio Hosting Process (рус: Включить ведущий процесс Visual Studio)

z-arthur

ЦитироватьДля .Net все-таки получилось обойти эту ошибку, учтя все нюансы, которые описаны по ссылке, которую выше уже давали:
http://pinvoke.net/default.aspx/ole32.CoInitializeSecurity
По этой ссылке пишется, что в управляемом коде CoInitializeSecurity вызывается до метода Main. Возможно CoInitializeSecurity вызывается не с параметрами "Подключиться", "Делегирование". И может в этом проблема.
Я эту проблему в службе решил, но не с помощью CoInitializeSecurity и уже не помню, как решал.
Может в VB по другому, чем в C# =), или еще какие-то нюансы есть.