我的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");
}
使用name:LicensePolicy.dll
编译此DLL定义文件:
LIBRARY
MODULE“LicensePolicy” EXPORTS 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很好。
感谢您的帮助!
的Aldemar
答案 0 :(得分:2)
如果你能在这种边界上可靠地返回一个std :: string,我会感到惊讶。 C ++对象通常很难通过API边界,因为不确定谁以及管理分配/解除分配的人。
我总是以非常'c-like'的方式在C#和C ++之间进行互操作,所有char *和size_t,部分原因是如果互操作示例使用的是Win32 API,那就是C语言,而不是C ++。
对于这种类型的字符串返回,我要使c ++函数取一个char *和一个size_t,然后从C#端传递一个StringBuilder,其中保留了空格。