2010-11-22 13 views
1

Ich arbeite mit etwas Hardware, die eine DLL hat. Ich glaube, es gibt zwei Methoden zum Aufruf der Funktionalität (von der Verwendung einer DLL-Spion-App).VB6/C++ WINAPI zu C#

Es arbeitet zur Zeit in VB6

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)) 

ich „gezwungen“ werden zu C# 2008/2010 der Lage sein, sich zu bewegen einige andere Hardware zu verwenden, die nicht in VB6 unterstützt wird.

Also, ich versuche, das oben genannte zu verwenden und in den AccessViolationException Fehler zu laufen. Ich bin "glücklich" genug, um eine C++ - Header-Datei mit den WinAPI-Definitionen zu haben, aber immer noch zu kämpfen. Jede Hilfe würde sehr geschätzt werden.

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); 

Mein C# ist so weit

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()); 

Es ist wahrscheinlich etwas einfach, aber ich bin relativ neu in der Sprache C# (nur einige Desktop-Programmierung und Silverlight getan).

Vielen Dank im Voraus

Antwort

0

Das Standard-Marshalling für Zeichenfolgen ist als 8-Bit-Zeichen, LPWSTR ist jedoch eine Unicode-Zeichenfolge. Der Rückgabetyp ist ebenfalls nicht korrekt. Fix:

[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

Will es versuchen. Danke :) –

+0

Legende! Vielen Dank! –

+0

Ich kann nicht wählen, weil ich nicht den Ruf habe, aber du verdienst es! –

0

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

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

das Problem ist in diesen Zeilen. Der C++ - Strukturtyp von ihnen ist LPWSTR, der zu IntPtr in .net übersetzt wird, das ein Zeiger auf ein Objekt ist.

+0

Ich verstehe das. Also irgendeine Idee wie ich das durchhalte? –

+0

yeah gut, du hättest diese Frage ohne die negative bedeutungslose Abstimmung stellen können. löse es auf deinem eigenen Kumpel. –

+0

Ich habe dich nicht negativ, soweit ich weiß. Ich bin noch nicht mal eingeloggt. Aber trotzdem danke! :) –