powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Из Дельфи передать хэндл формы в COM библиотеку.
20 сообщений из 20, страница 1 из 1
Из Дельфи передать хэндл формы в COM библиотеку.
    #38779129
Ростигай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет.

Подскажите пожалуйста, как нужно правильно описать типы, чтобы передать в COM библиотеку, написанную на C#, передать хэндл формы ?

Мне нужно вызвать этот метод:
http://msdn.microsoft.com/en-us/library/ms223190.aspx

У него последний параметры, типа IntPtr.

Для простоты использую позднее связывание COM без TLB - пока только тестовый вариант библиотеки.

Delphi код:

Код: pascal
1.
  tempI :=  Plugin.Test (Self.Handle);  << Просто пытаюсь передать хэндл формы.



C# Код:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
        public int Test(IntPtr hwndParentForm)
        {
            X509Store certStore = new X509Store("MY", StoreLocation.CurrentUser);
            certStore.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
            var selectedCertificate = X509Certificate2UI.SelectFromCollection(certStore.Certificates
                    , "Выберите сертификат"
                    , "Выберите сертификат и подтвердите нажатием на кнопку ОК."
                    , X509SelectionFlag.SingleSelection
                    , hwndParentForm);

            return 0;
        }



Но при вызове метода, в Delphi программе, вылетает ошибка:
Код: xml
1.
Project1.exe raised exception class EOleSysError with message 'интерфейс не поддерживается'.



'интерфейс не поддерживается' - мне не понятно. Не пойму о чем вообще сообщает ошибка. Подозреваю, что дело в маршалинге, но как правильно вызывать ?

PS. Если переделать метод, передавая туда, к примеру, просто integer тип, то метод работает. Проблема явно при передаче хэндла на форму.
...
Рейтинг: 0 / 0
Из Дельфи передать хэндл формы в COM библиотеку.
    #38779343
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ростигай'интерфейс не поддерживается' - мне не понятно. Не пойму о чем вообще сообщает ошибка. Подозреваю, что дело в маршалинге, но как правильно вызывать ?Надо правильно расставить COM-атрибуты на сишарпных классах/методах.
...
Рейтинг: 0 / 0
Из Дельфи передать хэндл формы в COM библиотеку.
    #38779820
Ростигай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей КРостигай'интерфейс не поддерживается' - мне не понятно. Не пойму о чем вообще сообщает ошибка. Подозреваю, что дело в маршалинге, но как правильно вызывать ?Надо правильно расставить COM-атрибуты на сишарпных классах/ методах .


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
procedure TForm1.Button1Click(Sender: TObject);
var
  Plugin: Variant;
  tempi:  integer;
begin
  try
    Plugin := CreateOleObject(TestServiceName);
  except
    Plugin := Unassigned;
  end;
  if not VarIsEmpty(Plugin) then
  begin
    tempi :=  Plugin.test(Self.Handle);
  end;
end;




Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
    [ComVisible(true)]
    [Guid("B5275E07-08CB-4F2B-A2B2-AB3538E1C8DB")]
    public interface ITestService
    {
        int testc(IntPtr hwndParentForm);        
    }

    [ComVisible(true), ClassInterface(ClassInterfaceType.None)]
    [Guid("F5384142-923C-408A-83E1-74BF88BEBB20")]
    public class TestService : ITestService
    {
        public int test(IntPtr hwndParentForm)
        {
            X509Store certStore = new X509Store("MY", StoreLocation.CurrentUser);
            certStore.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
            var selectedCertificate = X509Certificate2UI.SelectFromCollection(certStore.Certificates
                    , "Выберите сертификат"
                    , "Выберите сертификат и подтвердите нажатием на кнопку ОК."
                    , X509SelectionFlag.SingleSelection
                    , hwndParentForm);

            return 0;
        }
    }



Сборка помечена, как COM-доступная.
Мм... Что я упустил, подскажите пожалуйста ?

Как-то нужно помечать C# методы ?
...
Рейтинг: 0 / 0
Из Дельфи передать хэндл формы в COM библиотеку.
    #38780022
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ростигай,

не ты первый, меняй на Int64 и будет счастье (tlb кривой получается)
...
Рейтинг: 0 / 0
Из Дельфи передать хэндл формы в COM библиотеку.
    #38780067
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилменяй на Int64Зачем? Он же сам выбирает размер указателя IntPtr?
...
Рейтинг: 0 / 0
Из Дельфи передать хэндл формы в COM библиотеку.
    #38780070
Ростигай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил,

Спасибо ) Попробую.
...
Рейтинг: 0 / 0
Из Дельфи передать хэндл формы в COM библиотеку.
    #38780072
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
РостигайДля простоты использую позднее связывание COM без TLB

...

'интерфейс не поддерживается' - мне не понятно.Ну может надо атрибут какой повесить, чтобы дотнетом реализовывался IDispatch?
...
Рейтинг: 0 / 0
Из Дельфи передать хэндл формы в COM библиотеку.
    #38780075
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КРостигайДля простоты использую позднее связывание COM без TLB

...

'интерфейс не поддерживается' - мне не понятно.Ну может надо атрибут какой повесить, чтобы дотнетом реализовывался IDispatch?Таки надо. Подробности тут .
...
Рейтинг: 0 / 0
Из Дельфи передать хэндл формы в COM библиотеку.
    #38780112
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КЗачем? Он же сам выбирает размер указателя IntPtr?
По идее должен, но не выбирает
или Int64 или Variant(object)


в tlb(midl) нельзя записать переменный размер
...
Рейтинг: 0 / 0
Из Дельфи передать хэндл формы в COM библиотеку.
    #38780125
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилАлексей КЗачем? Он же сам выбирает размер указателя IntPtr?
По идее должен, но не выбираетУ меня выбирает, в зависимости от разрядности процесса, в который загружается дотнетная dll. IntPtr этим и отличается от всех остальных.
...
Рейтинг: 0 / 0
Из Дельфи передать хэндл формы в COM библиотеку.
    #38780129
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилв tlb(midl) нельзя записать переменный размерИли про какой размер? Я про размер указателя 32 или 64 бита в зависимости от разрядности процесса: x86 или x64.
...
Рейтинг: 0 / 0
Из Дельфи передать хэндл формы в COM библиотеку.
    #38780153
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,

я об этом же
нет в COM такой возможности - скомпили под x86,64,AnyCPU и сравни tlb
...
Рейтинг: 0 / 0
Из Дельфи передать хэндл формы в COM библиотеку.
    #38780174
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилАлексей К,

я об этом же
нет в COM такой возможности - скомпили под x86,64,AnyCPU и сравни tlbНу COM-то в данном случае дотнетный. А дотнет знает при маршалинге размер указателя. В TLB так же указано, что параметр является указателем: void* .
...
Рейтинг: 0 / 0
Из Дельфи передать хэндл формы в COM библиотеку.
    #38780176
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КВ TLB так же указано, что параметр является указателем: void* .
только что проверил - пишется LONG или int64

реальность расходится с теорией
...
Рейтинг: 0 / 0
Из Дельфи передать хэндл формы в COM библиотеку.
    #38780213
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилАлексей КВ TLB так же указано, что параметр является указателем: void* .
только что проверил - пишется LONG или int64

реальность расходится с теориейА так?
Код: c#
1.
2.
void F([MarshalAs(UnmanagedType.IUnknown)]IntPtr p)
{ }

зы: Может другой UnmanagedType указать, я не уверен.
...
Рейтинг: 0 / 0
Из Дельфи передать хэндл формы в COM библиотеку.
    #38780244
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кзы: Может другой UnmanagedType указать, я не уверен.
ну не лезет через IDispatch IntPtr
...
Рейтинг: 0 / 0
Из Дельфи передать хэндл формы в COM библиотеку.
    #38780287
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилАлексей Кзы: Может другой UnmanagedType указать, я не уверен.
ну не лезет через IDispatch IntPtr Блеат... Ну да и Бог с ним.
...
Рейтинг: 0 / 0
Из Дельфи передать хэндл формы в COM библиотеку.
    #38780313
Ростигай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так какое финальное решение правильное ? :)
...
Рейтинг: 0 / 0
Из Дельфи передать хэндл формы в COM библиотеку.
    #38780368
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
РостигайТак какое финальное решение правильное ? :)Моя ссылка + совет от Изопропила.
...
Рейтинг: 0 / 0
Из Дельфи передать хэндл формы в COM библиотеку.
    #38781866
Ростигай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо.

Изменил на тип Int64 и заработало.

Немного странновато появляется диалог. Строго в левом-верхнем углу формы.
Не знаете, как можно отпозиционировать его по центру формы ? А то просто не очень красиво и удобно. Просто функция
X509Certificate2UI не возвращает никаких указателей на созданный диалог, и не получает параметров, которые бы указывали где ей появляться.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Из Дельфи передать хэндл формы в COM библиотеку.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]