读书人

写了个dll,返回值在内部messagebox 显

发布时间: 2012-02-28 13:06:36 作者: rapoo

写了个dll,返回值在内部messagebox 显示ok,但外部调用return 值返回确是不对的字符?


#include "stdafx.h"
#include "ipget.h"
#include "stdio.h"


//BOOL APIENTRY DllMain( HANDLE hModule,
// DWORD ul_reason_for_call,
// LPVOID lpReserved
// )
//{
// return TRUE;
//}

#import "C:\WINDOWS\system32\msxml.dll"
#import "C:\WINDOWS\system32\msxml2.dll"
using namespace MSXML2;

HRESULT ComInit();


extern "C" _declspec(dllexport) LPTSTR IPGET2(LPCTSTR STR1)
{
ComInit(); //调用下面初始化COM的函数
IXMLHTTPRequestPtr xmlrequest; //定义变量
xmlrequest.CreateInstance("Msxml2.XMLHTTP");
xmlrequest->open(_bstr_t("GET"),_bstr_t("http://www.ip.cn/getip.php?action=getip&ip_url="),_variant_t("false"));
xmlrequest->send();
BSTR bstrbody;
xmlrequest->get_responseText(&bstrbody);
_bstr_t bstrtbody(bstrbody);
MessageBox(0, (LPCTSTR)bstrtbody, "OK", MB_OK);
return (LPTSTR)(LPCTSTR)bstrtbody;
}
//这里是初始化COM
HRESULT ComInit()
{
HRESULT hr = S_OK;
if FAILED(CoInitialize(NULL))
{
CoUninitialize();
hr = E_UNEXPECTED;
}
return hr;
}


\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

(LPCTSTR)bstrtbody 内部返回结果正确
外部调用时返回 “葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺”

为什么?


[解决办法]
没有初始化
[解决办法]
BSTR bstrbody;
xmlrequest->get_responseText(&bstrbody);
_bstr_t bstrtbody(bstrbody);
MessageBox(0, (LPCTSTR)bstrtbody, "OK", MB_OK);
return (LPTSTR)(LPCTSTR)bstrtbody;

相当于返回了一个栈上的变量...
函数结束的时候,上面的东西就不可信了...

你应该new一段东西出来,然后返回...
或者参考下面系列函数...

C/C++ code
GlobalAlloc FunctionAllocates the specified number of bytes from the heap.Note  The global functions are slower than other memory management functions and do not provide as many features. Therefore, new applications should use the heap functions. However, the global functions are still used with DDE, the clipboard functions, and OLE data objects.HGLOBAL WINAPI GlobalAlloc(  __in          UINT uFlags,  __in          SIZE_T dwBytes);
[解决办法]
xml下载者VC源码
仅供参考http://www.05112.com/Article/200805/18641.html
[解决办法]

_bstr_t bstrtbody(bstrbody); //这只是一个局部变量, 不是new出来的内存,函数结束,变量就消亡了
MessageBox(0, (LPCTSTR)bstrtbody, "OK", MB_OK);
return (LPTSTR)(LPCTSTR)bstrtbody;

[解决办法]
如果实现不想 new一个内存空间,你可以定义为static静态变量
[解决办法]
你不应该这么做,否则你多个函数同时调用它怎么办?new一个是正确方法
探讨
如果实现不想 new一个内存空间,你可以定义为static静态变量

[解决办法]
使用智能指针shared_ptr吧,不存在跨DLL的问题。

读书人网 >C++

热点推荐