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

1

Я получаю различные ошибки, когда пытаюсь запустить очень простой COM-клиент для очень простого COM-сервера, который я написал в C++. COM-сервер написан в C++ и имеет только один метод "GetSomeString". Я построил ocx сервера COM, зарегистрировал его с помощью regsrv32 и ссылался на него из следующего приложения консоли С#:

using MySimpleActivexControlLib;

namespace SimpleConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            var c = new MySimpleActivexControlLib.MySimpleActivexControl();
            c.GetSomeString();
        }
    }
}

Когда я запускаю код, я получаю следующее исключение:

Необработанное исключение типа "System.Runtime.InteropServices.COMException" произошло в файле mscorlib.dll

Дополнительная информация: Катастрофический сбой (Исключение из HRESULT: 0x8000FFFF (E_UNEXPECTED))

Я попытался использовать компонент из консольного приложения C++ и получил еще одну ошибку:

... Исключение Microsoft C++: _com_error в ячейке памяти 0x002bf5e4...

Полный код можно посмотреть здесь. Любая помощь будет высоко оценен.

  • 1
    Рассматривали ли вы использование отладчика, чтобы увидеть, почему возникает исключение?
  • 0
    @RaymondChen Спасибо за ваш ответ. В консоли C # после возникновения исключения это верхняя часть стека выполнения: 1. mscorlib.dll! System.RuntimeType.ForwardCallToInvokeMember (строковые члены memberName, System.Reflection.BindingFlags, цель объекта, int [] aWrapperTypes, ref System.Runtime.Remoting.Proxies.MessageData msgData) + 0x183 байта 2. [От родного к управляемому переходу] 3. [От управляемого к собственному переходу] 4. SimpleConsoleApp.exe! SimpleConsoleApp.Program.Main (string [] args) Строка 11 + 0x9 байт C # Edit: извините за плохое форматирование, я пытаюсь форматировать кадры стека более разумно.
Показать ещё 6 комментариев
Теги:
visual-c++
com
visual-studio-2010
com-interop

1 ответ

3
Лучший ответ

Это определенно зависит от того, что внутри элемента управления ActiveX, но вы не указали никакого кода этого.

Например, элемент управления может требовать, чтобы поток STA запускался и размещался надлежащим образом с помощью контейнера, совместимого с ActiveX, что не является вашим тестовым консольным приложением. Попробуйте это из приложения WinForms:

using System;
using System.Windows.Forms;
using AxSimpleActiveXControlLib;

class Program
{
    [STAThread]
    static void Main()
    {
        var c = new AxSimpleActiveXControlLib.AxSimpleActiveXControl();

        var form = new Form
        {
            Controls = { c }
        };

        form.Load += (s, e) => MessageBox.Show(c.GetSomeNumber().ToString());

        Application.Run(form);
    }
}

Это также может помочь:

Как создать HelloWorld COM Interop в Visual Studio 2012

Обновлено, когда вы добавляете ссылку на элемент управления MFC ActiveX, вы должны либо добавить его через панель инструментов Visual Studio WinForms, либо использовать инструмент AxImp.exe:

AxImp.exe SimpleActiveXControl.ocx 

Таким образом, он будет генерировать AxSimpleActiveXControlLib.dll и SimpleActiveXControlLib.dll. Первый будет содержать обертку System.Windows.Forms.Control -derived для вашего элемента управления ActiveX. Добавьте оба в свой проект, затем попробуйте код, который я разместил выше (обновлен на основе исходного кода, который вы опубликовали).

  • 0
    Спасибо за ваш ответ. Я создал элемент управления Activex с использованием VS 2010, создав новый проект «Элемент управления MFC ActiveX» с настройками по умолчанию, а затем добавив один метод к элементу управления, используя представление класса -> щелкните правой кнопкой мыши файл IDL -> добавьте метод. Вам нужно больше деталей? Я могу добавить код, но это 99% шаблон от создания проекта в VS.
  • 1
    @JohnnyW, что происходит, когда вы тестируете его с помощью WinForms, как я и предлагал? Кроме того, как именно выглядит GetSomeString?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню