小编Tis*_*tos的帖子

P/Invoke,c#:unsigned char丢失一个字节

我正在努力为软件SDK的DLL文件,我试图调用一个函数来获取有关软件主机的信息.

在函数想要的结构中有两个unsigned char变量(HostMachineAddress,HostProgramVersion),当我尝试从c#调用它时,我似乎"松散"了最后一个字节...如果我将下面的c#struct中的SizeConst更改为5我确实得到了丢失的字节,但是它导致另一个变量丢失了数据.

有人可以帮我找到解决这个问题的方法吗?也尝试使用类而不是struct导致system.stackoverflow错误

C#Struct

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct sHostInfo
{
    public int bFoundHost;
    public int LatestConfirmationTime;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
    public string szHostMachineName;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
    public string HostMachineAddress;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
    public string szHostProgramName;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
    public string HostProgramVersion;
}
Run Code Online (Sandbox Code Playgroud)

C#

[DllImport("Cortex_SDK.dll")]
public static extern int GetHostInfo(out sHostInfo pHostInfo);
Run Code Online (Sandbox Code Playgroud)

c# pinvoke marshalling unsigned-char

11
推荐指数
1
解决办法
1027
查看次数

PInvoke C#:Function将指针作为参数

我想在我的c#代码中访问这个函数,这可能吗?所以最后c ++代码会调用我的函数并应用名为"sFrameofData"的结构.

C++代码:

//The user supplied function will be called whenever a frame of data arrives.
DLL int Cortex_SetDataHandlerFunc(void (*MyFunction)(sFrameOfData* pFrameOfData));
Run Code Online (Sandbox Code Playgroud)

这可能会奏效吗?

C#代码:

[DllImport("Cortex_SDK.dll")]
public extern static int Cortex_SetDataHandlerFunc(ref IntPtr function(ref IntPtr pFrameOfData) );
Run Code Online (Sandbox Code Playgroud)

c# pinvoke param

10
推荐指数
1
解决办法
9477
查看次数

c#:在类中保留构造函数的ref参数

基本上我希望能够在类的实例中引用变量,但我希望引用成为类变量,所以我不需要在类的内部作为参数发送它

码:

int num = 0;
myClass(num);
print num; // output is 0 but i'd like it to be 10 :)
class myClass
{
    private int classNumber;
    myClass(ref int number)
    {
        print number; //output is 0

        // id like this to be a reference to the refenrence
        classNumber = number;

        DoSomething();
    }
    public void DoSomething()
    {
        ClassNumber = 10;
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么我要问这是因为我正在使用winforms并且有一个主表单将一个类的实例发送到一个新表单,该表单应该编辑该类并将其发回...现在我使用Form.ShowDialog()来避免用户在新表单中编辑时使用主表单,然后从新表单中获取数据

editForm edtfrm = new editForm(ref instanceOfClass);
edtfrm.showDialog();
//grab the instance back
instanceOfClass = edtfrm.editedClass;
Run Code Online (Sandbox Code Playgroud)

我怎么解决这个问题?我不喜欢这个解决方案

c# reference winforms

8
推荐指数
2
解决办法
4610
查看次数

pugixml"extend"元素来增加价值

我试图设置元素的值,当元素看起来像这样时<element></element>我会这样做:

pugi::xml_node node = xmlBase.child("element");
pugi::xml_node nodechild = node.first_child();
nodechild.set_value(this->elementValue);
Run Code Online (Sandbox Code Playgroud)

但是,当我有一个看起来像这样的元素:

<element />
Run Code Online (Sandbox Code Playgroud)

这不会工作..我尝试在"set_value"行之前使用它

if(nodechild == NULL)
{
    nodechild = node.append_child();
}
Run Code Online (Sandbox Code Playgroud)

但这会在该元素中创建一个新元素,我不想这样做,

也许我的拳头方法甚至是错的?你如何正确设置元素的值?

c++ xml pugixml

3
推荐指数
1
解决办法
2592
查看次数

标签 统计

c# ×3

pinvoke ×2

c++ ×1

marshalling ×1

param ×1

pugixml ×1

reference ×1

unsigned-char ×1

winforms ×1

xml ×1