VB6/C++;WINAPI到C#
我正在使用一些有DLL的硬件。我相信它有两种调用功能的方法(使用DLL spy应用程序) 它目前在VB6中使用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
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小时前错误地按下了按钮。很抱歉,看来我不小心差点引起骚乱!我会试一试的。谢谢:我不能投票,因为我没有这个名声,但你应得的!