2014-10-22 3 views
2

큰 그림 - 일반 C++ 코드 (일부 함수는 네임 스페이스에 넣음)가 있으며이 C++ 항목을 호출해야하는 C# 코드가 있습니다. C++/CLI 래퍼를 작성하는 것이 유일한 방법입니다. 내가 읽은 것을 토대로 reg.C++의 헤더를 사용하고 reg.C++ dll과 연결해 봅니다.C++/CLI 코드에서 HWND를 소개하는 방법은 무엇입니까?

첫 번째 문제는 HWND입니다. reg.C++에서 그것은 희미한 공기에서 온 것입니다. (심지어 적절하지도 않고 VS가 받아들입니다.) CLI/C++에서을 명시 적으로 추가했습니다. 따라서 추가 할 수있는 경로는 c:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include\ (*)입니다.

#include <windef.h> 

(C++/CLI 코드)이 코드에는 winnt.h이 포함되어 있으며이 파일에 오류가 있습니다. 나는 reg.C++를 CLI/C++ 코드에 포함 시켰다고 생각한다.

그렇다면 C++/CLI에 대한 정의는 HWND입니까?

(*)이 디렉토리는 reg.C++ 프로젝트에서 VS가 HWND이라는 정의를 찾았 기 때문에이 디렉토리입니다.

업데이트 나중에 Windows Development Kit 8.0을 설치하고 windows.h을 포함하는 경로를 가리 키도록 변경했지만 포함 된 파일에서 오류가 발생했습니다. 비교를 위해 동료에게 내게 빈 프로젝트를 만들어달라고 요청한 후 솔루션에 추가했습니다. 그래서 지금은 VS/CLI 프로젝트를 제대로 만들 수 없다는 VS의 셋업에 이상한 점이 있다고 생각합니다. C#에서

답변

2

당신이 예제 코드이에서 HWND에 안전하게

모습을 시전 할 수 있습니다 C의 시스템 :: IntPtr입니다 ++ 사용해야 있도록, Win32에서 핸들에 대한 System.IntPtr 이름을 사용

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

+0

reg.C++ 코드에서 아무 것도 캐스트 할 수 없습니다. 고정되어 있기 때문에 (수정할 수는 없습니다). C++/CLI에서는 HWND가 C++/CLI에서 VS에 대해 알 수없는 형식이기 때문에 HOWD를 IntPtr에 캐스트 할 수 없습니다. – greenoldman

1

네이티브 C++에서는 HWND가 포함되지 않고 해결되었거나 선언되었지만 다시 보길 원할 수도 있습니다. 이것이 가장 확실한 경우는 아닙니다. windef.h를 포함하는 windows.h가 일반적으로 포함되어있는 미리 컴파일 된 헤더 (예 : stdafx.h)를 사용하고있을 수 있습니다. 그렇지 않으면 명시 적 include가 존재하거나 HWND가 정의되지 않습니다.

다음으로 C++/CLI는 windows.h를 포함하고 HWND를 사용하는 것을 금지하지 않습니다. (이것은 일반적이며, 나는 정확히 그렇게하는 여러 프로젝트가 있습니다.) 예를 들어, D3D interop 또는 Media Foundation 라이브러리 통합의 경우 HWND를 전달하는 것이 가장 자주 필요합니다.

래퍼 라이브러리가 windows.h를 포함하여 베어 스톤 코드로 컴파일되도록하는 것이 좋습니다.

나는 PInvoke보다 C++/CLI를 강력히 선호하며, PInvoke가 래퍼에 대한 필요성을 제거하는 옵션이기도하다는 것을 이미 알고있을 것입니다. 그러나 PInvoke는 마샬링 오버 헤드가 있으며 진입 점 서명과 관련하여 약간 깨지기 쉽습니다.

이 정보가 도움이되기를 바랍니다. 임박한 다음 질문에 기꺼이 도와 드리겠습니다.