使用安全模式从DLL(通过(INTPTR)参数传递到该函数)获取char **
Using safe mode to get char** from dll (Passed as (IntPtr) parameter to the function)
我有一个我通过 char**
指针的dll:我可以按照vs 2010 c#不安全模式来执行此操作:
public unsafe void loadParamListFromWks()
{
char** list = null;
dllFunctionGetList((IntPtr)(&list));
int i = 0;
IntPtr ptr;
while ((ptr = (IntPtr)parameterNames[i]) != IntPtr.Zero)
{
Console.WriteLine(Marshal.PtrToStringAnsi(ptr));
i++;
ptr = (IntPtr)parameterNames[i];
}
}
您看到的DLL填充了我在代码中使用的字符串(列表(的数组(列表(我该如何在安全模式下这样做?我希望得到一个简短的方法。
如果要避免使用unsafe
,请尝试以下方式。
使用dll导入属性。
使用名称空间System.Runtime.InteropServices
也用于DLL导入属性中的不同调用约定:
https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.callingconvention(v = vs.110(.aspx
(粗略代码。未测试(
//DECLARE THE FUNCTION FROM DLL
[DllImport(<<YOUR DLL>>,CallingConvention = CallingConvention.Cdecl, CharSet=CharSet.Ansi)]
public static extern void dllFunctionGetList(IntPtr[] ListOfStrs);
//GET THE LIST OF STRINGS
IntPtr[] parameterNames = new IntPtr[100];
dllFunctionGetList(parameterNames);
int i = 0;
IntPtr ptr;
//ITERATE THE STRINGS
while ((ptr = (IntPtr)parameterNames[i]) != IntPtr.Zero)
{
Console.WriteLine(Marshal.PtrToStringAnsi(ptr));
i++;
}
相关文章:
- 将char*传递给pthread_read函数
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 从函数返回const char*数组
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 使用c#访问c++dll中带有char*参数的函数时发生AccessViolationException
- 将函数参数"const char*"转换为"std::string_view"是
- std::string 构造函数如何处理固定大小的 char[]?
- 在 constexpr 构造函数 (c++17) 中赋值到 const char * 在使用 Android NDK 时
- 构造函数 (C++) 中的 char 指针参数存在问题
- c ++ 如何在构造函数中初始化 char
- 当我尝试通过构造函数分配 char 数组时出现错误
- 将 char 指针传递给接受对 char 数组的引用的函数
- 在字符串函数中抛出'char const*'实例后调用的终止
- 使用 bool 和 const char 重载的 C++ 函数会在没有警告的情况下产生歧义 (MSVC2012)
- 调用'myStud::myStud(int, const char [5], int, int, int)'没有匹配函数
- C++函数返回两个 char 数组的相同索引元素
- 为什么const char*和const char[]作为函数参数被认为是等价的
- 为什么 char 数组在从 C++ 中的函数返回时会丢失?
- 如何使用这个原型函数char*encrypt(char*pEncryptedText,const char*pText)
- 仅用于模板化类型的附加构造函数<char>