各位哥哥,从c++的DLL中如何静态调用char* 类型返回的函数

rookies 2020-03-31 11:37:15


各位哥哥, 用C++的一个程序中 调用C++ DLL中的这个函数

extern "C" char* __stdcall GetSomething()

{
char* Name = "WuHan";
return Name;
}
在代码如下 :

char* vID = GetSomething();

结果显示 在 DLL中 NAME值 正常, 但是返回到C++程序却为空,请问问题在哪,怎么解决?感谢各位哥哥。
...全文
604 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2020-05-15
  • 打赏
  • 举报
回复
最好的是你传递个buffer到dll,dll中的接口填充这个buffer
木木夕阳子 2020-05-15
  • 打赏
  • 举报
回复
char* Name = "WuHan"分配的内存在栈上,函数运行完毕,也就是return后其生命周期就结束了,这时候会执行出栈然后被释放掉,所以函数不要返回局部变量的指针。局部变量/函数的参数都是在栈区的。 你可以new一个空间,这个开辟的空间是在堆上的,函数执行完毕,也不会被释放掉,需要自己手动释放才可以;new之后,再拷贝下数据到你申请的内存中 至于new之后关于dll中内存释放的问题,就是另外一个问题
船过水无痕 2020-04-26
  • 打赏
  • 举报
回复
std::string dll传输过程如果不同编译方式,可能会有内存释放崩溃。建议用 GetSomething(char *pBuf, int size) { strncpy(pBuf, "你的数据", std::min(strlen("你的数据"), size)); }
走好每一步 2020-04-23
  • 打赏
  • 举报
回复
引用 楼主 rookies 的回复:
各位哥哥, 用C++的一个程序中 调用C++ DLL中的这个函数 extern "C" char* __stdcall GetSomething() { char* Name = "WuHan"; return Name; } 在代码如下 : char* vID = GetSomething(); 结果显示 在 DLL中 NAME值 正常, 但是返回到C++程序却为空,请问问题在哪,怎么解决?感谢各位哥哥。
定义全局字符串 static const char *version = "something"; const char* GetSomeThing(void) { return version; }
mdcire 2020-04-22
  • 打赏
  • 举报
回复
不要返回局部变量的指针或引用。
woshi_hujunjun 2020-04-09
  • 打赏
  • 举报
回复
用std::string多方便,不要用char*。把char*换成std::string 就可以了。
Yofoo 2020-04-06
  • 打赏
  • 举报
回复
extern "C" char* __stdcall GetSomething() { static char Name[] = "WuHan"; return Name; }
smwhotjay 2020-04-02
  • 打赏
  • 举报
回复
char* Name = "WuHan";
港道理因为是在全局静态变量里。但怎么被优化成了
char Name[] = "WuHan";
成了局部变量。
schlafenhamster 2020-04-02
  • 打赏
  • 举报
回复
char* Name = "WuHan";// 在 栈 中
return Name;// name 被 destroy 指针 无效 !
zgl7903 2020-03-31
  • 打赏
  • 举报
回复
__stdcall 在函数退出时就清栈了,一般不能使用局部变量做返回值 试试 __cdecl 或者建议把缓冲区和缓冲区和长度作为指针传入,这样不受调用规约影响 extern "C" char* __stdcall GetSomething(char *szBuffer, int iLen) { strcpy_s(szBuffer, iLen, "xxxx"); return szBuffer; }
待续_1006 2020-03-31
  • 打赏
  • 举报
回复
GetSomething函数修改一下,GetSomething(CString str);
rookies 2020-03-31
  • 打赏
  • 举报
回复
引用 2 楼 zgl7903 的回复:
__stdcall 在函数退出时就清栈了,一般不能使用局部变量做返回值 试试 __cdecl 或者建议把缓冲区和缓冲区和长度作为指针传入,这样不受调用规约影响 extern "C" char* __stdcall GetSomething(char *szBuffer, int iLen) { strcpy_s(szBuffer, iLen, "xxxx"); return szBuffer; }
__cdecl 返回仍然是空,我觉得应该是清栈之后找不到原内存位置的值 然后我用了后面这个公式,提示 错误 2 error LNK1120: 1 个无法解析的外部命令
rookies 2020-03-31
  • 打赏
  • 举报
回复
引用 1 楼 待续_1006 的回复:
GetSomething函数修改一下,GetSomething(CString str);
CString 好像需要头文件支持, 我这个是在一个DLL程序中

15,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧