Я хотел бы иметь класс WPF, реализующий простую форму, например окно, где могу ли я выводить текстовые сообщения, используя «shared». открытая функция, скажем, OutputText. Я хочу создать экземпляр объекта класса, который, в свою очередь, просто создает текстовое окно формы, а с помощью OutputText просто отправляет в него некоторый текст. Все это необходимо сделать из приложения C++, используя открытый класс COM и функцию CoCreateInstance, чтобы все заработало.
Вот код C#:
Код: Выделить всё
using Microsoft.SqlServer.Server;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WpfCustomControlLibrary11
{
[Guid("0E633447-41D9-4E28-A8F4-D24ADE2913CD")]
public interface ICustomControl1
{
void Test();
}
[Guid("2002FDA9-E74A-4A88-B0E3-0CCD2C2695AD")]
public class CustomControl1 : Control
{
static CustomControl1()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1)));
}
public void Test()
{
MessageBox.Show("CustomControl1 - Test");
System.Console.Beep();
}
}
}
Код: Выделить всё
#include
#include
#include
#import
//#include
EXTERN_C const CLSID CLSID_FileOpenDialog2;
const GUID CLSID_riid = { 0xe633447, 0x41d9, 0x4e28, { 0xa8, 0xf4, 0xd2, 0x4a, 0xde, 0x29, 0x13, 0xcd } };
const GUID CLSID_rclsid = { 0x2002fda9, 0xe74a, 0x4a88, { 0xb0, 0xe3, 0xc, 0xcd, 0x2c, 0x26, 0x95, 0xad } };
using namespace std;
using namespace WpfCustomControlLibrary11;
HANDLE fileHandle;
char buffer[100];
ICustomControl1* g_pMyComClient = NULL;
HRESULT g_hr = NULL;
void RunClient() {
HRESULT hr = CoInitializeEx(NULL,
//COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE
COINIT_MULTITHREADED
);
if (SUCCEEDED(hr))
{
ICustomControl1* pMyComClient;
hr = CoCreateInstance(
CLSID_rclsid,
NULL, CLSCTX_ALL,
CLSID_riid,
reinterpret_cast(&pMyComClient));
if (SUCCEEDED(hr)) {
g_hr = hr;
g_pMyComClient = pMyComClient;
pMyComClient->Test();
}
CoUninitialize();
}
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR lpCmdLine, int nCmdShow)
{
sprintf(buffer, "WinMain - creating Client thread\n");
OutputDebugString(buffer);
buffer[0] = '\0';
thread newThread(RunClient);
newThread.join();
sprintf(buffer, "WinMain - Client thread has ENDED!\n");
OutputDebugString(buffer);
buffer[0] = '\0';
return 0;
}
- создал проект C#, используя шаблон WPF Custom Control Library (.NET Fremework).
- отметил "Сделать сборку COM-видимой" в проекте настройки.
- подписал библиотеку, используя "sn -k Proj_Name.snk", а затем указав этот ключ в разделе "подпись" в настройках проекта.
- зарегистрировался через RegAsm.exe
- добавлено в GAC через gacutil /i
Что любопытно, когда я создаю только проект Windows Forms, используя шаблон Windows Forms Control Library (.NET Fremework), и выполняю описанные выше шаги, все работает отлично - CoCreateInstance не возвращает ошибок, и функция test успешно выполняется. вызывается.
Какова может быть причина того, что класс проекта WPF НЕ регистрируется и, следовательно, не используется клиентом C++, в то время как класс проекта Windows Forms регистрируется и работает безупречно?
Заранее спасибо за помощь!>
Подробнее здесь: https://stackoverflow.com/questions/798 ... ss-for-com
Мобильная версия