Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.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
C# 如何将结构地址传递到C中的Void指针[Void*]到VC++;动态链接库_C#_C++_Pinvoke - Fatal编程技术网

C# 如何将结构地址传递到C中的Void指针[Void*]到VC++;动态链接库

C# 如何将结构地址传递到C中的Void指针[Void*]到VC++;动态链接库,c#,c++,pinvoke,C#,C++,Pinvoke,//结构: struct MYDATA{ char calls[4069]; char Desc[4096]; char error[1024]; } ; //测试功能 char *Argv[] = { "ToolName", "USername", "192.168.2", "3", "400"}; typedef void* ( *__stdcall pCstartSIPSessionint)(char **argv ); typedef struct

//结构:

struct MYDATA{
char calls[4069];      
char Desc[4096];   
char error[1024];     

} ;
//测试功能

char *Argv[] = { "ToolName", "USername", "192.168.2", "3", "400"};  
typedef void* ( *__stdcall  pCstartSIPSessionint)(char **argv ); 
typedef struct MYDATA*(*__cdecl pgetStat) ();

pCstartSIPSessionint startSessionint = (pCstartSIPSessionint )GetProcAddress(HMODULE (hGetProcIDDLL),"startSessionint"); 
//Dll导入

HINSTANCE hGetProcIDDLL = LoadLibrary(TEXT("E:\\MyDll.dll"));

pgetStat getStat ;
getStat = (pgetStat ) startSessionint(Argv);

MYDATA *mydata;
if(getStat != NULL)
        mydata= getStat();
printf("\n mydata\n %s ", mydata->call); 
printf("\n mydata\n %s ", mydata->summary); 
printf("\n mydata\n %s ", mydata->error);
如何在C#中转换代码? 我把结构的地址传给C中的Void*# 我只能传递值,如何才能将地址传递给结构

提前谢谢

结构应该是:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct MYDATA
{
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4096)]
    public string calls;      
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4096)]
    public string Desc;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)]
    public string error;     
}
我假设问题中的4069值是一个输入错误

第一个功能是:

[DllImport(dllname, CharSet = CharSet.Ansi)] 
public static extern IntPtr startSessionint(string[] argv);
然后将函数指针转换为委托:

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate IntPtr getStatDelegate();
....
IntPtr ptr = startSessionint(argv);
if (ptr == IntPtr.Zero)
    // handle error
getStatDelegate getStat = (getStatDelegate)Marshal.GetDelegateForFunctionPointer(ptr, typeof(getStatDelegate));
现在您可以调用该函数:

IntPtr structPtr = getStat();
然后封送到结构:

MYDATA data = (MYDATA)Marshal.PtrToStructure(structPtr, typeof(MYDATA));

它正在工作,但会抛出警告/错误,如-----------托管调试助手“PinVokeStackDistancer”在“c:\users\vts\documents\visual studio 2013\Projects\AppNew\AppNew\bin\Debug\AppNew.exe”中检测到问题。附加信息:调用PInvoke函数“AppNew!”!AppNew.Form1::startSessionint'已使堆栈不平衡。这可能是因为托管PInvoke签名与非托管目标签名不匹配。检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配。提前感谢好吧,也许startSessionint真的是cdecl。我打赌它真的是cdecl。你有实现吗?它在这里工作得很好。一周过去了。我不知道你的代码现在是什么样子。我想我已经回答了你的问题。没关系。我不能再提供了。我回答了您提出的问题。“这很有帮助,但我用一些行构造了……如果我运行了几次,我认为intptr具有相同的内存地址……我可以知道y–user3322182吗”……您必须向我们展示“回调/委托”函数中的内容……以确定为什么它总是返回相同的指针。