【发布时间】:2011-12-13 18:24:46
【问题描述】:
首先,我是一名 C# 程序员,所以我对 C++ 的工作知识相当有限。大学的时候拿回来的,10年没碰过,如果是比较简单的东西请见谅。
我正在尝试制作一个可以在 C# 中使用的 DLL,它实现了 libwpd 库。
我已经成功创建了一个 DLL,它导出了我可以通过 P/Invoke 访问的 2 个函数。第一个返回一个常量整数(由 Visual Studio 作为示例生成),第二个返回一个字符串。
如果我从函数返回一个常量字符串,它会成功传递给 C#,我可以在另一端读取它,所以我知道数据正在被传回。
我遇到的问题是 libwpd。我不得不修改他们的 TextDocumentGenerator.cpp 文件以将信息添加到 char* 而不是使用他们使用的 printf 以便我以后可以访问它。
我已将变量定义添加到头文件的公共部分,以便我可以从调用代码中读取它。
现在,我正在尝试编写一个函数,允许我将 libwpd 提供的 char* 添加到外部 char*。
我想出了这个:
char* addString(const char* addThis, char* toThis)
{
char* copier = (char*)malloc(strlen(toThis) + 1 + 1);
strcpy(copier, toThis);
strcpy(copier, "1");
toThis = (char*)malloc(strlen(copier) + 1);
strcpy(toThis, copier);
return copier;
}
但是当我传回信息时,我得到一个空白字符串。
我通过调用totalFile = addString("\n", totalFile);来调用函数
(我意识到它应该只在技术上重复添加“1”到字符串中,但它甚至没有这样做)
如果我将复印机线路的 strcpy 更改为 strcat,它会锁定。
我不知道如何在 C++ 中创建程序,所以我什至可以通过这些函数来查看发生了什么。
我们将不胜感激。
【问题讨论】:
-
strcpy(copier, toThis); strcpy(copier, "1");- 一方面,第二个strcpy会覆盖第一个的结果。 -
如果你发现自己在 C++ 中使用
malloc,这几乎总是意味着你做错了什么。如果你发现自己在 C++ 中使用new,这可能仍然意味着你做错了什么;标准模板库中已经提供了许多需要new的常见场景。 -
@Trevor 一个友好的提示:我建议将您的 C++ 项目编译为 C++/CLI,并在项目中为本机代码创建一个托管包装器。这样,它与它的接口就更干净了。您只需像往常一样添加一个引用,就可以创建包装器的托管实例,其中包含指向本机类的非托管指针。
-
不要忘记在 DLL 中编写和导出另一个函数来释放分配的字符串。 DLL 有它自己的内存管理器。
标签: c++ visual-studio-2008 dll strcat