2009-04-22 3 views
1

Windows Form을 사용하려는 C++ 콘솔 응용 프로그램이 있습니다. 나는 어떻게해야할지 모르므로 MFC를 사용하고 싶지 않다. 대신 C#을 사용하여 COM dll (클래스 라이브러리)을 만듭니다. 응용 프로그램과 dll을 대상 컴퓨터에 배포 할 때 응용 프로그램이 COM 인터페이스를보고 dll에서 만든 클래스를 사용할 수 있도록 dll을 등록해야합니다. 나는이 작업을 수행 할 수있는 몇 가지 방법이 알고WinXP 컴퓨터에 COM 어셈블리를 자동으로 등록하는 방법

:

  1. 내 응용 프로그램의 설치 사용 RegAsm을 되세요 - 나는 때문에 두 가지의를 사용하지 않으 : 몰라요 A. 그 대상 PC의 위치 (어딘가에 있더라도 경로를 하드 코딩하지 않으려합니다.) B. 설치 프로그램에서 regasm을 재배포 할 수 있지만 Microsoft가 자유롭게 허용하는지 여부는 확실하지 않습니다.

  2. 내 응용 프로그램의 설치 프로그램에서 gacutil을 사용하도록하십시오 - 위와 동일합니다.

  3. 개발 컴퓨터에서 regasm을 사용하여 .reg 파일을 만든 다음 응용 프로그램 설치 프로그램에서 .reg 파일을 실행하게하십시오.이 문제에는 두 가지 문제가 있습니다. A. 제거 할 때 DLL을 등록 취소 할 수 없습니다. B.reg를 실행하면 레지스트리에 정보를 추가 할 것인지 사용자에게 묻는 regedit가 호출됩니다.이 정보는 자동으로 "예"로 표시되어 사용자가 결정하지 못하게하려는 것입니다. regedit에는/silent 인수가 없으므로 이것을 사용하지 않았습니다.

  4. Inno 설치 프로그램을 사용하고 COM 라이브러리의 .tlb 파일 (regtypelib 플래그)을 등록하십시오 - 시도했지만 등록이 제대로 작동하지만 응용 프로그램은 여전히 ​​해당 클래스의 인스턴스를 만들 수 없습니다.

  5. ClickOnce를 사용하여 응용 프로그램을 배포하십시오. 응용 프로그램을 사용자의 Documents and Settings 폴더가 아닌 디스크의 특정 폴더에 저장하고 싶기 때문에이 옵션을 사용할 수 없습니다.

나는 C++ 및 C# Visual Studio 9.0 용 Express Edition을 사용하고 있음을 언급해야합니다. Windows XP 컴퓨터에서 COM 라이브러리를 등록하는 다른 방법이 있습니까?

편집 - 업데이트 :

내가 여기 http://msdn.microsoft.com/en-us/library/ms973915.aspx에서의 예에서 자신을 안내 등록이 필요없는 COM을 시도했다. 내가 매니페스트에서 가진 문제를 제쳐두고 떠나자 마침내 COM DLL (등록이 필요 없음)을 "볼"수있는 응용 프로그램을 얻었습니다. 매니페스트가 작동 중입니다. 아쉽게도 CoCreateInstance()를 호출하면 E_OUTOFMEMORY (0x8007000E)가 반환됩니다. COM dll에는 두 개의 클래스가 있지만 COM-visible 인터페이스 (다른 하나는 Form의 클래스이며 private로 지정하려는 경우) 만 만들 수 있습니다. 이것이 문제가 될 수 있습니까? 도움을

#import "MyGUI_DLL.tlb" raw_interfaces_only named_guids 
[…] 
static MyGUI_DLL::MyGUI * g = NULL; 
r = CoInitializeEx(NULL, COINIT_MULTITHREADED); 
// r is S_OK here 
r = CoCreateInstance(MyGUI_DLL::CLSID_MyGUIClass, NULL, CLSCTX_INPROC_SERVER, MyGUI_DLL::IID_MyGUI, reinterpret_cast<void**>(&g)); 
// r returns E_OUTOFMEMORY 

감사 : 는 여기에 몇 가지 코드입니다.

+0

당신은 런타임 동안 .NET 설치 경로를 감지 GetCORSystemDirectory()를 사용할 수 있습니다 여기에 좋은 기사가있다. regasm과 gacutil은 항상 .NET 설치와 동일한 상대적 위치를가집니다. – sharptooth

+0

코드 샘플에 대한 답변보기 http://stackoverflow.com/questions/741632/is-there-a-tool-out-there-to-find-out-which-net-framework-is-installed-on- a-pc/741732 # 741732 – sharptooth

답변

0

대신 등록이 필요없는 com을 사용해야합니다. 이렇게하면 여러분이 언급 한 모든 문제를 피할 수 있지만 독점적으로 사용된다면 프로그램이 winxp 이전 머신에서 작동하지 않게됩니다 ... 귀하의 경우에는 중요하지 않습니다.

0

interop 어셈블리를 처리하는 시나리오에서는 COM 구성 요소를 올바르게 설치해야한다는 사실을 간과하고 있습니다.

코드를 통해이를 수행하려면 P/Invoke 레이어를 통해 LoadTypeLib API 함수를 호출해야합니다.

그러나 최상의 솔루션은 등록이 필요없는 COM이라고 생각합니다.

http://msdn.microsoft.com/en-us/magazine/cc188708.aspx

관련 문제