2010-01-15 5 views
2

나는 C++ 클래스 (SLABHIDDevice.dll)에 대한 dll을 가지고 있습니다. 이 DLL의 기능을 C# .net 응용 프로그램에서 사용하려고합니다. DLL은 DLLImport를 사용하여 개체 가져 오기

[DllImport("SLABHIDDevice.dll")] 
     public static extern byte GetHidString 
      (Int32 deviceIndex, Int32 vid, Int32 pid, 
      Byte hidStringType, String deviceString, 
      Int32 deviceStringLength); 

문서 (내가 잘못 여기에 몇 가지 용어를 얻는 경우에 나는 appolagize 내가 사용 DLL이 새로운 오전) ... 나는 이와 같은 진술을 쉽게 사용할 수있는 여러 가지 방법을 포함 SLABHIDDevice.dll에는 클래스 개체 인 CHIDDevice도 포함되어 있다고합니다. 이고 해당 객체에는 Open()과 같은 멤버 함수의 전체 목록이 있습니다.

위와 같은 구문을 사용하여 Open()을 가져 오려고하면 Open() 함수의 진입 점을 찾을 수 없다는 오류가 발생합니다. Open()이 CHIDDevice의 멤버이기 때문에입니까?

이것은 DUMPBIN의 dll 구성입니다 ... 아래 세 함수 만 작동 할 수 있습니까? 누구든지 다른 구문을 사용하는 데 필요한 구문을 알고 있습니까? 함수 이름 앞에있는 물음표는 무엇을 의미합니까?

Dump of file SLABHIDDEVICE.dll 

File Type: DLL 

    Section contains the following exports for SLABHIDDevice.dll 

    00000000 characteristics 
    47E13E0F time date stamp Wed Mar 19 12:23:43 2008 
     0.00 version 
      1 ordinal base 
      26 number of functions 
      26 number of names 

    ordinal hint RVA  name 

      4 0 00001000 [email protected]@[email protected]@@Z 
      5 1 00001330 [email protected]@[email protected] 
      6 2 00001430 [email protected]@[email protected] 
      7 3 00001080 [email protected]@[email protected]@@Z 
      8 4 00020044 [email protected]@[email protected] 
      9 5 00001460 [email protected]@@QAEEXZ 
     10 6 00001C70 [email protected]@@QAEHXZ 
     11 7 00001CA0 [email protected]@@QAEGXZ 
     12 8 00001850 [email protected]@@[email protected] 
     13 9 00001C80 [email protected]@@QAEGXZ 
     14 A 00001BE0 [email protected]@@[email protected] 
     15 B 00001A20 [email protected]@@[email protected] 
     16 C 00001CB0 [email protected]@@QAEKXZ 
     17 D 00001C90 [email protected]@@QAEGXZ 
     18 E 00001730 [email protected]@@[email protected] 
     19 F 00001CC0 [email protected]@@[email protected] 
     20 10 00001700 [email protected]@@QAEHXZ 
     21 11 000014A0 [email protected]@@[email protected] 
     22 12 00001360 [email protected]@@AAEXXZ 
     23 13 00001810 [email protected]@@[email protected] 
     24 14 00001B80 [email protected]@@[email protected] 
     25 15 000018C0 [email protected]@@[email protected] 
     26 16 00001CE0 [email protected]@@[email protected] 
      3 17 00001320 GetHidGuid 
      2 18 000GetHidString 
      1 19 00001190 GetNumHidDevices 

    Summary 

     6000 .data 
     7000 .rdata 
     5000 .reloc 
     4000 .rsrc 
     1C000 .text 

답변

3

참조하십시오. 기본 전화 끊기는 클래스 개체를 만들 수 없기 때문에 필요한 메모리 할당 크기를 찾을 수 없습니다. 암시 적 "this"포인터를 인스턴스 메서드에 전달하는 것은 또 다른 문제이며 레지스터에 전달해야합니다.

C++/CLI 언어를 사용해야하는 클래스의 관리되는 래퍼를 만들어야합니다. Google "C++/CLI wrapper"는 좋은 히트작입니다.

+0

'this'는 (적어도 VC++과 호환되는)'CallingConvention.ThisCall'이 있기 때문에 문제가되지 않습니다. 필요한 메모리 할당면은 DLL이 헤더를 사용할 수 있는지를 결정할 수 있습니다. 그렇지 않으면 아무도 C++에서 헤더를 사용할 수 없습니다. –

+0

흠, C# 컴파일러가 어떻게 그 헤더를 파싱하는지 확신 할 수 없습니다. –

1

C++은 이름 맹 글링을 사용합니다. 함수 이름 주변의 이상한 기호는 컴파일러/링커가 호출 규칙, 매개 변수, 반환 유형 등을 알 수있는 방법입니다.

함수와 함께 이름 변환을 사용하지 않으려면 다음을 수행해야합니다.

extern "C" { 
} 

문을 사용하십시오.

당신은 C++ 클래스의 인스턴스 메소드를 호출하는 P/호출을 사용할 수 없습니다 http://en.wikipedia.org/wiki/Name_mangling

관련 문제