C++ Dll 返回字符串数据

3_0 2012-05-15 04:12:49
C++ 到 C++ , Dll 怎么返回字符串数据
...全文
1068 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
还要说明一下。 在不同的模块中传递指针,必须用引用。
  • 打赏
  • 举报
回复
有一个比较好用的方法。 DLL中导出两个函数 void get( void *& buf ); void free( void *&buf); get( void *& buf) { buf = malloc( 1024 ); } free( void *& buf) { free( buf ); } 另一个模块调用它,可以像调用malloc和free一样。只是把新分配的空间用参数传递了而已。
「已注销」 2012-06-01
  • 打赏
  • 举报
回复
struct string_stub;

struct string_class
{
void (* delete)( struct string_stub * );
};

struct string_stub
{
struct string_class const *class;
};

typedef char const *string;

string alloc_string( char const *txt )
{
struct string_stub *ss;
int len;

len = strlen(txt);
ss = malloc( sizeof(struct string_stub) + len );
memcpy(ss + 1, txt, len + 1);

ss->class = & your_string_class;
return (string)(ss + 1);
}

void free_string( string p )
{
struct string_stub *ss = (struct string_stub *) p - 1;
ss->class->delete(ss);
}

简单实现一个string class,让string对象自己释放自己。
3_0 2012-05-28
  • 打赏
  • 举报
回复
DLL :

h中的声明
_declspec(dllexport) char* GetInputBox();

cpp中函数定义
char al[255];
char * GetInputBox()
{
CString str=Inbox;
strncpy(al,(LPSTR)(LPCTSTR)str,255);
return al;

}

//EXE调用Dll文件
typedef char* (*Dllfun)();
Dllfun GetInputBox;
HINSTANCE hdll;
hdll=LoadLibrary("CMyMessage.dll");
if(hdll==NULL)
{
FreeLibrary(hdll);
}
GetInputBox=(Dllfun)GetProcAddress(hdll,"GetInputBox");
if(GetInputBox==NULL)
{
FreeLibrary(hdll);
}

char *p;
p=(char *)GetInputBox();
StrConn.Format("%s",p);
FreeLibrary(hdll);

AfxMessageBox(StrConn);
gemo 2012-05-26
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

哈哈:自己解决吧;
DLL _declspec(dllexport) void * test(void)
{
static CStringArray strArr;
strArr.Add("1");
strArr.Add("2");
return (void *)&strArr;
}

调用
CStringArray *……
[/Quote]

你这个不是线程安全的,慎用
还是用指针+长度的方式比较好
hhyhw2001 2012-05-26
  • 打赏
  • 举报
回复
通过参数返回,不要通过返回值返回
3_0 2012-05-25
  • 打赏
  • 举报
回复
哈哈:自己解决吧;
DLL _declspec(dllexport) void * test(void)
{
static CStringArray strArr;
strArr.Add("1");
strArr.Add("2");
return (void *)&strArr;
}

调用
CStringArray * pArr;
pArr=(CStringArray *)test();
xiaohuh421 2012-05-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

谁能提供个小例子呢,用char * 返回时只能传递一个字符,例如:“123456“ 只返回 ”1“
[/Quote]

看你这个现象,可能是因为你库中返回的多字节字符串,而你调用dll的时候使用的又是ASCII字符形式输出.就会出现这种情况了
hdg3707 2012-05-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
谁能提供个小例子呢,用char * 返回时只能传递一个字符,例如:“123456“ 只返回 ”1“
[/Quote]
你这样试试就知道了到底是返回几个数据了:
a=r();//r的定义是这样:char* r( return "agaga");就是按2楼的定义方法
char b[10];
b[0]=a[0];
b[1]=a[1];
b[2]=a[2];
...
这样你就知道返回的是什么了,一定要判断有多少个字符,或者判断是否\0,或者是根据while(a!=NULL)来判断
3_0 2012-05-21
  • 打赏
  • 举报
回复
谁能提供个小例子呢,用char * 返回时只能传递一个字符,例如:“123456“ 只返回 ”1“
Eleven 2012-05-21
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
xxx(...char*...);
xxx(...wchar_t*...)
[/Quote]
char* xxx(...);
wchar_t* xxx(...);
Eleven 2012-05-21
  • 打赏
  • 举报
回复
xxx(...char*...);
xxx(...wchar_t*...)
shuzhongxunyu 2012-05-18
  • 打赏
  • 举报
回复
你好像理解错了吧
lijianli9 2012-05-17
  • 打赏
  • 举报
回复
返回值,参数返回都ok呀。
gemo 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

std::string
[/Quote]

不是有个规则,说是dll的导出函数最好使用C数据类型么?
  • 打赏
  • 举报
回复
std::string
Lactoferrin 2012-05-15
  • 打赏
  • 举报
回复
char*r()
{
return "adpiadapidsj";
}
zgl7903 2012-05-15
  • 打赏
  • 举报
回复
指针 + 缓冲区长度
ExportString(WCHAR*pWchar, DWORD dwBuffLen)

或VRIANT

15,472

社区成员

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

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