블로그 이미지
대갈장군

calendar

1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

Notice

2013. 9. 24. 05:57 프로그래밍/MSDN


// vcmcppv2_impl_dllimp.cpp
// compile with: /clr:pure user32.lib
using namespace System::Runtime::InteropServices;

// Implicit DLLImport specifying calling convention
extern "C" int __stdcall MessageBeep(int);

// explicit DLLImport needed here to use P/Invoke marshalling because
// System::String ^ is not the type of the first parameter to printf
[DllImport("msvcrt.dll", EntryPoint = "printf", CallingConvention = CallingConvention::Cdecl,  CharSet = CharSet::Ansi)]
// or just
// [DllImport("msvcrt.dll")]
int printf(System::String ^, ...); 

int main() {
   // (string literals are System::String by default)
   printf("Begin beep\n");
   MessageBeep(100000);
   printf("Done\n");
}
Begin beep
Done

위의 코드를 보면 PInvoke에 대한 경우들을 잘 설명하고 있는데 우선 첫번째가 Implicit DLLImport이다. Native로 작성된 DLL 어디엔가 __stdcall 호출 규약을 가지는 함수 MessageBeep(int) 가 정의되어 있다고 알려주는 한 줄의 코드로써 상황 종료다. 


다만 이런 암묵적인 PInvoke를 사용하기 위해서는 반드시 호출 함수의 입력 변수가 마샬링이 필요 없어야 한다. MessageBeep() 함수의 경우 int를 받기 때문에 Int32로 마샬링 없이 변환이 가능하므로 암묵적 PInvoke 사용이 가능하다.


두번째를 보게 되면 명시적인 DLLImport인데 이 명시적인 것도 두가지 방법이 있네. 첫번째는 보아하니 msvcrt.dll에서 printf 함수를 어떤 형태의 호출 규약으로 그리고 어떤 형태의 타입 (ANSI냐 Unicode냐)까지 명확하게 정의하는 것과 혹은 걍 간단하게 어떤 DLL을 가져와라라고 말하는 방법이다. 둘다 된다면 당연히 두번째 방법이 더 쉬지 않나? 


어쨌든 첫번째 방법은 단순한 함수 선언이고 두번째 방법은 DllImport 속성을 이용한 명시적 DLL 파일 이름을 지정하는 것. 그것이 가장 큰 차이점이고 두번째 방법 내부에서 또 추가적으로 더 명시할 수 있는 방법도 있다는 말. 


http://msdn.microsoft.com/en-us/library/2x8kf7zx.aspx

'프로그래밍 > MSDN' 카테고리의 다른 글

ClickOnce를 이용한 윈도우 폼의 배포  (3) 2013.09.27
Explicit PInvoke C++ (DllImport Attribute)  (0) 2013.09.24
Mixed, Pure, Verifiable  (0) 2013.09.20
[MSDN] .NET Framework 구조  (4) 2013.05.03
Pure C++: Hello, C++/CLI  (0) 2013.04.25
posted by 대갈장군