将字符串从c#传递到c dll时的错误行为
我对我的问题进行了大量研究,发现了许多与[如何将字符串从将字符串从c#传递到c dll时的错误行为,c#,c,winapi,dllimport,C#,C,Winapi,Dllimport,我对我的问题进行了大量研究,发现了许多与[如何将字符串从c#传递到cdll]相关的问题: 但是他们都帮不了我。我更愿意以任何方式问我的问题: 简要说明: 我的c函数在c#中正常工作,仅当我从以下位置交换GetProcessIntegrityLevel参数时(在cdll中以及在c#import dll中): BOOL-GetProcessIntegrityLevel(DWORD-dwPID,LPSTR-szIntegrityLevel) 对于这一点: BOOL-GetProcessIn
c#
传递到c
dll]相关的问题:
简要说明:
我的
c
函数在c#
中正常工作,仅当我从以下位置交换GetProcessIntegrityLevel
参数时(在c
dll中以及在c#
import dll中):
BOOL-GetProcessIntegrityLevel(DWORD-dwPID,LPSTR-szIntegrityLevel)代码>
BOOL-GetProcessIntegrityLevel(LPSTR-szIntegrityLevel,DWORD-dwPID)代码>
LPSTR szIntegrityLevel
,但在第二种状态下,它不工作,LPSTR szIntegrityLevel
与任何pid一起始终为空
我创建了一个
c
dll库,其中声明了以下c
函数,该函数通过pid获取进程的完整性级别
:
#define MAX_INTEGRITY_LEVEL_LENGTH 30
extern "C"
{
__declspec(dllexport) BOOL GetProcessIntegrityLevel(DWORD dwPID, LPSTR szIntegrityLevel);
}
C函数实现:
__declspec(dllexport) BOOL GetProcessIntegrityLevel(LPSTR szIntegrityLevel, DWORD dwPID);
并按如下方式调用c#
中的函数:
// Integrity level
StringBuilder integrityLevel = new StringBuilder(200);
if(GetProcessIntegrityLevel(11684, integrityLevel) == true)
{
MessageBox.Show(integrityLevel.ToString());
}
在这种状态下,当我运行程序时,GetProcessIntegrityLevel()
返回true
,但是对于任何pid
,消息框中的integrityLevel
总是空的
令人惊讶的是,当我在c
函数和c#
函数中交换参数时,它确实起作用了:
__declspec(dllexport) BOOL GetProcessIntegrityLevel(LPSTR szIntegrityLevel, DWORD dwPID);
这对我来说很奇怪。我还尝试了marshallas(UnmanagedType.LPStr)]
,但得到了相同的结果。在C#中,ulong
是一种64位类型。PID参数为DWORD
,为32位参数
将C#参数声明从
ulong
更改为uint
,以解决此问题。我对其他函数有此问题,它们几乎都有DWORD
类型,我应该测试它们。无论如何,谢谢你。
__declspec(dllexport) BOOL GetProcessIntegrityLevel(LPSTR szIntegrityLevel, DWORD dwPID);