gpt4 book ai didi

c++ - .NET C# 调用 C++ native Win32 DLL 时出现问题

转载 作者:行者123 更新时间:2023-11-30 04:11:13 24 4
gpt4 key购买 nike

我的 C++ DLL 源代码是:

#include "stdafx.h"
#include "LicensePolicy.h"

std::string GetLicense()
{
DWORD dwType = REG_SZ;
HKEY hKey = 0;
char value[1024];
DWORD value_length = 1024;
LPCWSTR subkey = L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\WSESecurityPolicy";
LONG openReg = RegOpenKeyEx(HKEY_LOCAL_MACHINE,subkey,0, KEY_WOW64_64KEY | KEY_QUERY_VALUE, &hKey);
if (openReg==ERROR_SUCCESS)
{
}
else
{
return "ERROR: No pudo abrir la ruta del registro";
}

LONG getReg = RegQueryValueEx(hKey, L"WSEHostProcessID", NULL, &dwType, (LPBYTE)&value, &value_length);
if (getReg==ERROR_SUCCESS)
{
return std::string(value);
}
else
{
return "ERROR: No pudo obtener el valor del registro";
}
}

std::string GetXmlTokenNode()
{
std::string result = GetLicense();
if (result == "ERROR: No pudo abrir la ruta del registro" ||
result == "ERROR: No pudo obtener el valor del registro")
{
std::ofstream myfile;
myfile.open ("punto2.txt");
myfile << result;
myfile.close();
return std::string("");
}
else
{
std::ofstream myfile;
myfile.open ("punto1.txt");
myfile << "Valor:" << result;
myfile.close();
}

return std::string("/{0}:Envelope/{0}:Header");
}

此DLL使用名称编译:LicensePolicy.dll

定义文件:

图书馆

模块“许可策略”导出 GetXmlTokenNode @1

C# TestDllConsole 测试DLL如下:

using System.Runtime.InteropServices;
using System.ComponentModel;

namespace TestDllConsoleApplication
{
class Program
{
[STAThread]
static void Main(string[] args)
{
Test testObj = new Test();
}
}

public class Test
{
[DllImport("LicensePolicy.dll", CharSet = CharSet.Unicode)]
public static extern string GetXmlTokenNode();

public Test()
{
try
{
string result = GetXmlTokenNode();
result += " result";
}
catch (DllNotFoundException exDll)
{
string error = "Dll no encontrado";
}
catch (BadImageFormatException exBad)
{
string error = "Plataforma Ensamblado incompatible";
}
catch (Win32Exception exWin32)
{
string error = "Error general de Win32";
}
catch (Exception ex)
{
string error = "Error otros";
}
}
}
}

我的问题是我不知道为什么当 GetXmlTokenNode(); C# 中的方法被执行,C# TestConsole 立即退出,没有从 DLL 获取结果。然而,使用文本文件跟踪 DLL 执行得很好。

感谢您的帮助!

阿尔德玛

最佳答案

如果您能够跨过这种边界可靠地返回一个 std::string,我会感到很惊讶。 C++ 对象通常难以跨越 API 边界传递,因为不确定谁和什么管理分配/释放。

我总是以非常“类 C”的方式在 C# 和 C++ 之间进行互操作,所有 char* 和 size_t,部分原因是如果互操作示例是使用 Win32 API 的,它是 C 而不是 C++。

对于这种类型的字符串返回,我会让 C++ 函数接受一个 char* 和一个 size_t,并且从 C# 端我会向它传递一个内部保留空间的 StringBuilder。

关于c++ - .NET C# 调用 C++ native Win32 DLL 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20292960/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com