VB6 / C ++ WINAPI для C # - PullRequest
       3

VB6 / C ++ WINAPI для C #

1 голос
/ 22 ноября 2010

Я работаю с некоторым оборудованием, которое имеет DLL. Я считаю, что у него есть два метода вызова функциональности (от использования шпионского DLL-приложения).

В настоящее время он работает в 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))

Я «вынужден» перейти на C # 2008/2010, чтобы иметь возможность использовать другое оборудование, которое не поддерживается в VB6.

Итак, я пытаюсь использовать вышеупомянутое и сталкиваюсь с ошибкой AccessViolationException. Мне «повезло», что у меня есть заголовочный файл C ++ с определениями WinAPI, но я все еще не могу. Любая помощь будет высоко ценится.

 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 # (немного программировал на компьютере и только в Silverlight).

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 22 ноября 2010

Маршалинг по умолчанию для строк выполняется в виде 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 голосов
/ 22 ноября 2010

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

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

проблема в этих строках. их тип структуры c ++ - LPWSTR, который переводится в IntPtr в .net, который является указателем на объект.

...