2014-10-22 3 views
2

Big picture - У меня есть обычный код на C++ (некоторые функции помещаются в пространства имен), и у меня есть код C#, который должен вызывать этот материал C++. Как мне сказали, единственный способ сделать это - написать C++/CLI-обертку. На основании того, что я читаю, я пытаюсь использовать заголовки из reg.C++ и ссылаться на dll reg.C++.Как ввести HWND в код C++/CLI?

Первая проблема у меня есть HWND. В reg.C++ он почти исходит из тонкого воздуха (у меня нет даже правильного включения для него, и VS принимает его), в CLI/C++ Я явно добавил include путь к c:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include\ (*), поэтому я мог бы добавить

#include <windef.h> 

в коде C++/CLI, но в свою очередь включает winnt.h и у меня есть ошибки в этом файле. Я чувствую, что включил reg.C++ в код CLI/C++, и он не подходит для этого.

So where есть HWND определение C++/CLI?

(*) Этот каталог, потому что в проекте reg.C++ VS найдено определение HWND.

Обновление Позже я установил Windows Development Kit 8.0, изменил пути к нему, включил windows.h, однако затем я получил ошибки внутри входящих файлов. Для сравнения я попросил своего коллегу создать для меня пустой проект, я добавил его в свое решение, и это сработало. Поэтому я считаю, что сейчас есть какая-то странная вещь с настройкой моего VS, он не может создать правильно проект CLI/C++.

ответ

2

В C# вы используете System.IntPtr для win32 ручек, так что вы должны использовать System :: IntPtr в C++, которые могут быть брошены в HWND безопасно

посмотреть на это, например, код:

http://blogs.msdn.com/b/yvesdolc/archive/2007/09/10/c-cli-intptr-to-an-hwnd.aspx

+0

Я не могу ничего отличить в коде reg.C++, потому что он исправлен (я не могу его изменить). В C++/CLI - это именно то, что я намереваюсь делать, но я не могу использовать HWND в IntPtr, потому что HWND - это неизвестный тип для VS в C++/CLI. – greenoldman

1

Вы упомянули, что с родным C++ HWND разрешен (или объявлен) без включения, однако вы можете снова посмотреть. Это, безусловно, не так. Возможно, вы можете использовать предварительно скомпилированный заголовок (т. Е. Stdafx.h), который обычно включает windows.h, который, в свою очередь, включает windef.h. В противном случае и явные include существуют, или HWND не будет определен.

Далее, C++/CLI не запрещает вам включать windows.h и использовать HWND (это обычное явление, и у меня есть несколько проектов, которые делают именно это). Например, при объединении D3D или включении библиотек Media Foundation передача HWND чаще всего необходима.

Возможно, вы захотите, чтобы ваша библиотека обертки собиралась с открытым кодом скелета, включая windows.h.

Я настоятельно рекомендую C++/CLI через PInvoke, и вы уже знаете, что PInvoke также является опцией, устраняя необходимость в оболочке. Но у PInvoke есть маршалинг накладных расходов, и он немного хрупкий относительно подписи точки входа.

Надеюсь, это поможет. Я был бы рад помочь с последующими вопросами, которые могут наступить.

Смежные вопросы