2010-11-22 8 views
1

DLL이있는 일부 하드웨어로 작업하고 있습니다. DLL 스파이 앱을 사용하여이 기능을 호출하는 두 가지 방법이 있다고 생각합니다.VB6/C++ WINAPI to C#

그것은 현재 VB6에서 지원되지 않는 다른 하드웨어를 사용할 수 있도록 2,010분의 2,008 C#에 이동하는

Public Type Versions 
    Pname As Long 
    Manuf As Long 
    VMajor As Long 
    VMinor As Long 
    VState As Long 
End Type 

Public Declare Function FLASH_GetVersion Lib "C:\flash_cntrl.dll" (ByVal fxc_Versions As Long) As Integer 

Dim vVers As Versions 
Dim strProdName As String 
Dim strManuf As String 

strProdName = "                        " 
strManuf = "                        " 

vVers.Manuf = StrPtr(strManuf) 
vVers.Pname = StrPtr(strProdName) 

iReturn = FLASH_GetVersion(VarPtr(vVers)) 

내가 "강제"하고있어를 사용하여 VB6에서 작동합니다.

위의 내용을 사용하여 AccessViolationException 오류가 발생했습니다. 필자는 WinAPI 정의가있는 C++ 헤더 파일을 가지고 있지만 여전히 어려움을 겪고있는 "행운"입니다. 어떤 도움이라도 대단히 감사 할 것입니다.

typedef struct { 
LPWSTR productname; 
LPWSTR manufacturer; 
unsigned Vers_Major; 
unsigned Vers_Minor; 
unsigned Vers_State;  // = 0 released, > 0 internal use only 
} FLASH_INFO; 

int WINAPI FLASH_GetVersion (FLASH_INFO *fxc_Version); 

내 C# 지금까지 그것은 아마도 간단한 뭔가

static class NativeMethods 
{ 
    [DllImport("C:\\flash_cntrl.dll")] 
    public static extern short FLASH_GetVersion(FLASH_INFO vVers); 
} 

public class FLASH_INFO 
{ 
    public string productname; 
    public string manufacturer; 
    public int Vers_Major; 
    public int Vers_Minor; 
    public int Vers_State; 
} 

     FLASH_INFO vers = new FLASH_INFO(); 

     string strManuf = "        "; 
     string strProdName = "        "; 

     vers.productname = strProdName; 
     vers.manufacturer = strManuf; 
     vers.Vers_Major = 0; 
     vers.Vers_Minor = 0; 
     vers.Vers_State = 0; 

     short sRet = NativeMethods.FLASH_GetVersion(vers); 

     Console.WriteLine("{0}|{1}", "sRet", sRet.ToString()); 

,하지만 난 (일부 데스크탑 프로그래밍 및 실버 만 수행) C# 언어에 비교적 새로운 해요.

답변

0

문자열의 기본 마샬링은 8 비트 문자로, LPWSTR은 유니 코드 문자열입니다. 리턴 유형이 올바르지 않습니다. 수정 :

[DllImport("C:\\flash_cntrl.dll")] 
public static extern int FLASH_GetVersion(ref FLASH_INFO vVers); 

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode) 
public struct FLASH_INFO 
{ 
    public string productname; 
    public string manufacturer; 
    public int Vers_Major; 
    public int Vers_Minor; 
    public int Vers_State; 
} 
+0

한번 해보십시오. 고마워요 :) –

+0

Legend! 고마워요! –

+0

저는 명성이 없기 때문에 투표를 할 수 없지만, 자격이 있습니다! –

0

문자열 strManuf = ""사전에 감사합니다; 문자열 strProdName = "";

vers.productname = strProdName; 
vers.manufacturer = strManuf; 

문제는 해당 줄에 있습니다. 그것들의 C++ struct 타입은 객체에 대한 포인터 인 .net의 IntPtr로 변환되는 LPWSTR입니다.

+0

나는 그것을 이해합니다. 어떻게 생각해? –

+0

그래, 네가 부정적인 의미없는 표결없이이 질문을했을 수도있다. 너의 친구로 해결해라. –

+0

나는 내가 아는 한 당신을 부정하지 않았다. 나는 심지어 로그인하지 않았다. 그러나 어떻게해서든지 고마워한다! :) –