我正在制作一个使用 C# 托管 DLL 的非托管 C++ DLL。我正在编写 C++ 库,因为我需要使用在软件中定义的函数和头文件,C++ 库可以作为插件添加。但是我想做的事情太复杂了,以至于我对 C++ 的了解会减慢我的速度,所以我决定用我最喜欢的 C# 做事情,并通过 COM 连接 DLL,我成功了。
我在使代码工作方面取得了某种成功,但在保持代码简洁方面不太成功,因为我显然不是专业的 C++ 程序员。
问题在于转换各种字符串类型。特别是 BSTR 和 const char *。
以下代码将 const char * 转换为 BSTR:
BSTR bstrt;
const char * someChar;
csharpInterfacedClassPointer->get_PropertyForSomeChars(&bstrt);
strcpy_s(nstring, (char *)bstrt);
someChar = nstring;
问题是,我有很多离散的 someChars 和相应的离散接口方法......属性方法是从 C# 接口生成的,所以我无法更改它。每个“someChar”都需要以下三行代码,因此对于 30 个离散变量,我需要编写 90 行代码。
csharpInterfacedClassPointer->get_PropertyForSomeCharX(&bstrt);
strcpy_s(nstring, (char *)bstrt);
someCharX = nstring;
问题是:如何为此编写一些快捷方式以便它只适合一行?
我用“getter”函数指针和 someChar 指针尝试了某种函数。
typedef HRESULT (__stdcall *get_string_func)(BSTR * str); //getter function pointer
//the converting function
void ConvertAndAssign(get_string_func bstr_get_fx, const char * constCharString)
{
const size_t nsize = 1000;
char nstring[nsize];
BSTR bstrt;
bstrt = bstr_t(constCharString);
bstr_get_fx(&bstrt);
strcpy_s(nstring, (char *)bstrt);
constCharString = nstring;
}
//calling the function...as I thought that would work
ConvertAndAssign(sPtr->get_DataFile, someChar);
但是随后编译器说了一些关于绑定函数的奇怪事情,以及它们如何不允许作为指针......我用谷歌搜索了它的含义以及更改函数定义所需的解决方案,但我不能这样做,因为定义是生成的来自 C# 代码(通过 regasm.exe)。
重要说明:最后我需要获取 const char * 类型,因为它是我正在为其制作 C++ DLL 的程序的函数所需的输入类型。