Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 


다음과 같이 VS.NET 2005에서 C#으로 간단하게 Class Library를 만들었습니다.

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace ClassLibrary1
{
    [ComVisible(true)]
    [Guid("23172f2f-a3d3-4180-97ae-7805f74a5a45")]
    [ClassInterface(ClassInterfaceType.AutoDual)]
    public class SecureWrap
    {
        public bool CheckLicense()
        {
            MessageBox.Show("1111111111", "222222222222", MessageBoxButtons.OK);
            return true;
        }
    }
}

컴파일해서 나온 내용을 아래와 같이 레지스트리에 등록하고 TLB 파일을 얻어냈습니다.

    regasm ClassLibrary1.dll /codebase /tlb:ClassLibrary1.tlb

SecureWrap 클래스를 Native VC++에서 사용하는 예제를 만들었습니다. 간단한 Console Application입니다.
아래와 같이 간단하게 코드를 작성하고 컴파일을 하였습니다.

#include "stdafx.h"
#import "..\ClassLibrary1\bin\Debug\ClassLibrary1.tlb" no_namespace

void _tmain(int argc, _TCHAR* argv[])
{
	CoInitialize( NULL );

	{	
		_SecureWrapPtr ptr;
		ptr.CreateInstance( __uuidof( SecureWrap ) );

		VARIANT_BOOL vtBool;
		ptr->CheckLicense( &vtBool );
	}

	CoUninitialize();
}

하지만, 위와 같이 하게 되면 다음과 같은 오류들이 발생하게 됩니다.

d:\temp2\consolecpp\debug\classlibrary1.tlh(62) : error C2146: syntax error : missing ';' before identifier 'GetType'
d:\temp2\consolecpp\debug\classlibrary1.tlh(62) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
d:\temp2\consolecpp\debug\classlibrary1.tlh(62) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
d:\temp2\consolecpp\debug\classlibrary1.tlh(62) : warning C4183: 'GetType': missing return type; assumed to be a member function returning 'int'
d:\temp2\consolecpp\debug\classlibrary1.tli(35) : error C2143: syntax error : missing ';' before '_SecureWrap::GetType'
d:\temp2\consolecpp\debug\classlibrary1.tli(35) : error C2433: '_TypePtr' : 'inline' not permitted on data declarations
d:\temp2\consolecpp\debug\classlibrary1.tli(35) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
d:\temp2\consolecpp\debug\classlibrary1.tli(35) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
d:\temp2\consolecpp\debug\classlibrary1.tli(39) : error C2064: term does not evaluate to a function taking 2 arguments
d:\temp2\consolecpp\consolecpp.cpp(19) : error C2660: '_SecureWrap::CheckLicense' : function does not take 1 arguments

첫 번째 오류의 GetType 메서드 정의를 TLH 파일에서 찾아보면 아래와 같이 나오는 것을 볼 수 있습니다.

    _TypePtr GetType ( );

_Type에 대해서 Smart Pointer 처리가 된 것을 볼 수 있습니다. 하지만, 위의 콘솔 애플리케이션의 어느 곳에서도 _Type에 대한 Smart Pointer 정의를 발견할 수 없기 때문에 이러한 오류가 나오는 것인데요. 이를 해결하기 위해서는 2가지 방법을 선택할 수 있습니다.

첫 번째 방법은, _TypePtr 형식이 사용되지 않도록 Raw Interface 유형으로 TLH 파일을 생성하는 것입니다. 다음과 같이 import 지시자에 옵션을 하나 더 주게 되면 이를 가능하게 해줍니다.

#import "..\ClassLibrary1\bin\Debug\ClassLibrary1.tlb" raw_interfaces_only  no_namespace

두 번째 방법은, _TypePtr 형식이 컴파일되도록 Smart Pointer 처리를 해주는 것입니다. 이러한 처리는 개발자가 직접 _COM_SMARTPTR_TYPEDEF을 해줄 수도 있겠지만, import로 생성된 TLH 파일의 상단 주석 부분을 보면 어떻게 해야 하는지 친절하게 가르쳐 주고 있습니다.

// compiler-generated file created 05/02/06 at 23:08:07 - DO NOT EDIT!

//
// Cross-referenced type libraries:
//
//  #import "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.tlb"
//

이를 적용하여 다음과 같이 간단하게 호출을 할 수 있습니다.

#include "stdafx.h"


#import "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.tlb" no_namespace
#import "..\ClassLibrary1\bin\Debug\ClassLibrary1.tlb" no_namespace

void _tmain(int argc, _TCHAR* argv[])
{
	CoInitialize( NULL );

	{	
		_SecureWrapPtr ptr;
		ptr.CreateInstance( __uuidof( SecureWrap ) );
		ptr->CheckLicense();
	}

	CoUninitialize();
}







[최초 등록일: ]
[최종 수정일: 6/26/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 46  47  48  [49]  50  51  52  53  54  55  56  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
12748정성태8/2/202115939개발 환경 구성: 589. Azure Active Directory - tenant의 관리자(admin) 계정 로그인 방법
12747정성태8/1/202116155오류 유형: 748. 오류 기록 - MICROSOFT GRAPH – HOW TO IMPLEMENT IAUTHENTICATIONPROVIDER파일 다운로드1
12746정성태7/31/202124155개발 환경 구성: 588. 네트워크 장비 환경을 시뮬레이션하는 Packet Tracer 프로그램 소개
12745정성태7/31/202116503개발 환경 구성: 587. Azure Active Directory - tenant의 관리자 계정 로그인 방법
12744정성태7/30/202116593개발 환경 구성: 586. Azure Active Directory에 연결된 App 목록을 확인하는 방법?
12743정성태7/30/202118151.NET Framework: 1083. Azure Active Directory - 외부 Token Cache 저장소를 사용하는 방법파일 다운로드1
12742정성태7/30/202115814개발 환경 구성: 585. Azure AD 인증을 위한 사용자 인증 유형
12741정성태7/29/202117520.NET Framework: 1082. Azure Active Directory - Microsoft Graph API 호출 방법파일 다운로드1
12740정성태7/29/202116102오류 유형: 747. SharePoint - InvalidOperationException 0x80131509
12739정성태7/28/202116403오류 유형: 746. Azure Active Directory - IDW10106: The 'ClientId' option must be provided.
12738정성태7/28/202117619오류 유형: 745. Azure Active Directory - Client credential flows must have a scope value with /.default suffixed to the resource identifier (application ID URI).
12737정성태7/28/202116705오류 유형: 744. Azure Active Directory - The resource principal named api://...[client_id]... was not found in the tenant
12736정성태7/28/202116982오류 유형: 743. Active Azure Directory에서 "API permissions"의 권한 설정이 "Not granted for ..."로 나오는 문제
12735정성태7/27/202115965.NET Framework: 1081. C# - Azure AD 인증을 지원하는 데스크톱 애플리케이션 예제(Windows Forms) [2]파일 다운로드1
12734정성태7/26/202132835스크립트: 20. 특정 단어로 시작하거나/끝나는 문자열을 포함/제외하는 정규 표현식 - Look-around
12733정성태7/23/202121967.NET Framework: 1081. Self-Contained/SingleFile 유형의 .NET Core/5+ 실행 파일을 임베딩한다면? [1]파일 다운로드2
12732정성태7/23/202114462오류 유형: 742. SharePoint - The super user account utilized by the cache is not configured.
12731정성태7/23/202116485개발 환경 구성: 584. Add Internal URLs 화면에서 "Save" 버튼이 비활성화 된 경우
12730정성태7/23/202118349개발 환경 구성: 583. Visual Studio Code - Go 코드에서 입력을 받는 경우
12729정성태7/22/202116370.NET Framework: 1080. xUnit 단위 테스트에 메서드/클래스 수준의 문맥 제공 - Fixture
12728정성태7/22/202116996.NET Framework: 1079. MSTestv2 단위 테스트에 메서드/클래스/어셈블리 수준의 문맥 제공
12727정성태7/21/202118099.NET Framework: 1078. C# 단위 테스트 - MSTestv2/NUnit의 Assert.Inconclusive 사용법(?) [1]
12726정성태7/21/202117557VS.NET IDE: 169. 비주얼 스튜디오 - 단위 테스트 선택 시 MSTestv2 외의 xUnit, NUnit 사용법 [1]
12725정성태7/21/202116218오류 유형: 741. Failed to find the "go" binary in either GOROOT() or PATH
12724정성태7/21/202119207개발 환경 구성: 582. 윈도우 환경에서 Visual Studio Code + Go (Zip) 개발 환경 [1]
12723정성태7/21/202115260오류 유형: 740. SharePoint - Alternate access mappings have not been configured 경고
... 46  47  48  [49]  50  51  52  53  54  55  56  57  58  59  60  ...