STDMETHODIMP CAttendEx::GetEnrollData(LONG a, LONG b, BSTR* c)
{
// TODO: 在此添加实现代码 //1
CString str;
BSTR *bstr=NULL; long d;
long e[500];
long f;
char buffer1[20];
char buffer2[20];
wchar_t vecbuf[4000];
wcscpy_s(vecbuf,L"");
//2
typedef long (WINAPI *GetED)(long,long,long,long*,long[],long*);
HMODULE hModule;
hModule = ::LoadLibrary(L"FKAttend.dll");
if (!hModule)
{
MessageBox(NULL,L"DLL加载失败",L"LoadLibrary",MB_OK);
return S_FALSE;
}
GetED geted=(GetED)::GetProcAddress(hModule,"FK_GetEnrollData");
if (!geted)
{
MessageBox(NULL,L"获取函数地址失败",L"GetProcAddress",MB_OK);
return S_FALSE; }
//3
geted(CAttendEx::nHandleIndex,a,b,&d,e,&f);
/*str.Format(L"%ld",&d);
*bstr = str.AllocSysString();
memcpy(vecbuf,bstr,sizeof(bstr));*/ wchar_t numbuf[20]; //4
for(int i=0; i < 500; i++)
{
swprintf_s(numbuf,L"%.8",e[i]);
wcscat_s(vecbuf,numbuf); }
/**bstr=NULL;
str.Format(L"%ld",&f);
*bstr = str.AllocSysString();
memcpy(vecbuf,bstr,sizeof(bstr));*/ *c=SysAllocString(vecbuf);
/*str.Format(L"%ld,%ld,%ld",&d,e,&f);
*bstr = str.AllocSysString();*/
/*memcpy(c, bstr, sizeof(bstr));*/
sprintf_s(buffer1,"%d,",d);
/*sprintf_s(buffer1,"%d,",e);*/
sprintf_s(buffer2,"%d,",f);
CComBSTR rPart; rPart.Append(buffer1);
rPart.Append(vecbuf);
rPart.Append(buffer2);
*c=rPart.Copy(); rPart.Empty(); FreeLibrary(hModule);
return S_OK;
}
在调用DLL中的该接口方法时弹出错误提示如下:Debug Assertion Failed:Program: C:\Program Files\Internet Explorer\iexporer.exe
File: f:\rtm\vctools\crt_bld\self_X86\crt\src\output.c
Line: 2308Expression: ((state == ST_NORMAL) || (state ++ ST_TYPE))For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts.
不过我这个程序没有返回来加载dll里的指针参数值 不知道什么问题
估计是调用人家DLL的时候没有返回来值啊
好是好了,乱码就出现了。仔细研究BSTR等串转换问题吧。
{
// TODO: 在此添加实现代码 /*char* a1 = _com_util::ConvertBSTRToString(a);
char* b1 = _com_util::ConvertBSTRToString(b);*/
*c=NULL; HMODULE hModule;
hModule = ::LoadLibrary(L"FKAttend.dll"); typedef long (WINAPI *GetED)(long,long,long,long*,long[],long*);
if (!hModule)
{
return S_FALSE;
}
GetED geted=(GetED)::GetProcAddress(hModule,"FK_GetEnrollData");
if (!geted)
{
return S_FALSE; }
UserInfo *userInfo = new UserInfo;
if(!userInfo)
{
return S_FALSE;
}
//ZeroMemory(userInfo,sizeof(UserInfo)); userInfo->nEnrollNumber=a;
userInfo->nBackNumber=b;
/*memcpy(userInfo->nEnrollNumber,a1,strlen(a1));
memcpy(userInfo->nBackNumber,b1,strlen(b1));*/ //调用DLL中的函数
geted(CAttendEx::nHandleIndex,userInfo->nEnrollNumber,userInfo->nBackNumber,&userInfo->pnMachinePrivilege,userInfo->pnEnrollData,&userInfo->pnPassWord);
//定义字符数组来存放返回值
char Pri[20]={""};
char pEnrollData[10000]={""};
char passWord[20]={""};
int dim=500;
char numbuf[40];
/*_bstr_t pri1(userInfo->pnMachinePrivilege);
_bstr_t pED1(userInfo->pnEnrollData);
_bstr_t pw1(userInfo->pnPassWord);*/
sprintf_s(Pri,"%d",userInfo->pnMachinePrivilege); //sprintf_s(pEnrollData,"%d",userInfo->pnEnrollData);//单个传能显示部分
/*循环传全部显示0?????????*/
for(int i=0; i < dim; i++)
{
sprintf_s(numbuf,"%d,",userInfo->pnEnrollData[i]);
strcat_s(pEnrollData,numbuf);
}
sprintf_s(passWord,"%d",userInfo->pnPassWord);
//pri1.Format("%d",userInfo->pnMachinePrivilege);
/*pED1.Format("%d",userInfo->pnEnrollData);
pw1.Format("%d",userInfo->pnPassWord); memcpy(Pri,pri1,sizeof(pri1));
memcpy(pEnrollData,pED1,sizeof(pED1));
memcpy(passWord,pw1,sizeof(pw1));*/ //在各返回值最后加上“;”便于区分
char *ter = ";";
strcat_s(Pri,ter);
strcat_s(pEnrollData,ter);
strcat_s(passWord,ter); //将返回值转换为CComBSTR类型,因为数据包含空格,采用CComBSTR(int nSize, LPCSTR sz)构造函数
CComBSTR cPri(Pri);
CComBSTR cpEnrollData(pEnrollData);
CComBSTR cpassWord(passWord); //将转换后值连接起来并返回 CComBSTR rPart; rPart.AppendBSTR(cPri);
rPart.AppendBSTR(cpEnrollData);
rPart.AppendBSTR(cpassWord);
//*c=rPart.Copy();
*c=rPart.Detach(); //rPart.Empty(); delete userInfo; FreeLibrary(hModule);
return S_OK;
}个位快帮我看看吧!我都急死了
http://www.programbbs.com/doc/186.htm
_com_util::ConvertStringToBSTR()