2017-10-07 10 views
2

COM interop을 사용하여 C++ 응용 프로그램에서 C# DLL의 메서드를 호출하고 있습니다.COM 인터페이스 포인터 만들기는 개발 컴퓨터에서 작동하지만 다른 컴퓨터에서는 응용 프로그램 충돌이 발생합니다.

C# 코드는 다음과 같습니다

namespace MyLibrary 
{ 
    [ComVisible(true)] 
    [Guid("f08942b1-db20-44aa-9713-7d28fff51e2b")] 
    public interface IMyLibraryInterface 
    { 
    string POSRequest(string request); 
    } 

    [ComVisible(true)] 
    [Guid("4d962dd5-05ed-431b-82e2-378aebe8d0dc")] 
    public class MyLibraryInterface : IMyLibraryInterface 
    { 
    public string myRequest(string request) 
    { 
     .... 
     return response; 
    } 
    } 
} 

호출 C++ 코드는 다음과 같습니다

#import "MyLibrary.tlb" 

이 모두 작동 디버깅 할 때 : 관련 TLB 파일이 가져온

CoInitialize(NULL); 
MyLibrary::IMyLibraryInterfacePtr MyLibraryInterface(__uuidof(MyLibrary::MyLibraryInterface)); 
myResult = (LPCTSTR) MyLibraryInterface->myRequest(myInput); 
CoUninitialize(); 

내 개발 컴퓨터에서 릴리스 버전을 실행하고 있지만이 때 실행하면 응용 프로그램이 중단됩니다. 다른 기계. 특히, 포인터를 만드는 줄이 문제인 것으로 보입니다.

MyLibrary::IMyLibraryInterfacePtr MyLibraryInterface(__uuidof(MyLibrary::MyLibraryInterface)); 

다른 컴퓨터에는 뭔가 빠져있는 것 같지만 무엇을 알아 내지 못합니까?

+1

다른 컴퓨터에 C# COM dll을 등록 했습니까? 'regasm.exe'를 사용하여 dll을 등록해야합니다. – pstrjds

+0

은 프로젝트의 작업 디렉토리에있는 dll이거나 작성한 프로그램이 액세스 할 수있는 새 시스템의 어딘가에 있습니까? – holycatcrusher

+0

C# dll을 등록해야한다는 것을 알지 못했습니다. 이것이 설치 될 때마다이 작업을 수행해야합니까? –

답변

3

COM 인터페이스를 제공하는 dll을 사용하는 경우 해당 dll을 등록해야합니다. C# COM dll을 등록하는 도구는 regasm.exe입니다. 설치 프로세스의 일부로 COM 인터페이스를 노출하는 dll에서 regasm을 호출해야합니다. 디버깅 및 도움의 일환으로 코드를 약간 수정하여 개체를 만들려고 할 때 HRESULT를 확인하고 필요한 경우 기록 할 수 있습니다.
참고 :이 코드를 테스트 할 수있는 설정이 없으므로 오타가 될 수 있지만 올바른 방향으로 알려야합니다. VS에서 생성하는 "스마트 포인터"가없는 경우 CoCreateInstance 호출을 사용하여 개체를 만든 다음 해당 호출에서 HRESULT를 확인할 수 있습니다.

IMyLibraryInterfacePtr myIntPtr = null; 
HRESULT hRes = myIntPtr.CreateInstance(__uuidof(MyLibrary::MyLibr‌aryInterface)); 
if (!(SUCCEEDED(hRes)) 
{ 
    // This means an error occurred, you can log it for debugging, etc. 
} 

MickyD의 의견을 바탕으로 편집 , 그리고 완성을 위해, DLL을 registering없이 COM을 사용하는 방법이있다. 여기에는 응용 프로그램과 함께 사는 매니페스트 파일을 만드는 작업이 포함됩니다.

+1

니스. 플러그도 주셔서 감사합니다 :) – MickyD

+1

@MickyD - 크레딧이 적용됩니다! 너 내 기억이 났어. 난 regfree COM 물건에 대해 잊어 버렸습니다, 지금 돈 상자의 책 "Essential COM"을 통해 쏟아져 나오는 시간을 상기합니다 ... 그 사람들이 행복한 추억인지는 모르겠습니다. 참고 : 이것은 책에 대한 슬램이 아니며 그 책은 COM을 이해하는 데 도움이되는 예외적 인 것이 었습니다. COM에서의 작업이 행복한 기억인지는 확실하지 않습니다. – pstrjds

+0

고맙습니다. Wrox Press의 COM 및 DCOM (저를 제외하고!) 책을 많이 읽었습니다. 네, 지금 쉬운 방법이 있습니다 :) – MickyD