簡體   English   中英

VB6 / C ++ WINAPI到C#

[英]VB6/C++ WINAPI to C#

我正在使用一些具有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錯誤。 我足夠“幸運”,可以擁有帶有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#語言還是比較陌生(只做過一些桌面編程和Silverlight)。

先感謝您

字符串strManuf =“”; 字符串strProdName =“”;

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

問題出在那些方面。 它們的c ++結構類型是LPWSTR,它轉換為.net中的IntPtr,后者是指向對象的指針。

字符串的默認封送處理為8位字符,但是LPWSTR是Unicode字符串。 返回類型也不正確。 固定:

[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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM