Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VB6/C++;WINAPI到C#_C#_C++_Vb6 Migration - Fatal编程技术网

VB6/C++;WINAPI到C#

VB6/C++;WINAPI到C#,c#,c++,vb6-migration,C#,C++,Vb6 Migration,我正在使用一些有DLL的硬件。我相信它有两种调用功能的方法(使用DLL spy应用程序) 它目前在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 fx

我正在使用一些有DLL的硬件。我相信它有两种调用功能的方法(使用DLL spy应用程序)

它目前在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)

提前感谢您

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

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

问题就在这些方面。其中的C++结构类型是LpWSTR,它转换为.NET.NET中的指针,它是指向对象的指针。

< P>字符串的默认封送处理是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;
}

我明白。你知道我是怎么做到的吗?是的,你本可以在没有反对票的情况下问这个问题的。你自己解决吧,据我所知,我没有否定你。我甚至还没有登录。不过还是要谢谢你!:)我以为是你干的。一定是有人在附近点击。没问题似乎是我给了负面反馈,但这是偶然的。显然,我的投票现在被锁定了,因为我在7小时前错误地按下了按钮。很抱歉,看来我不小心差点引起骚乱!我会试一试的。谢谢:我不能投票,因为我没有这个名声,但你应得的!