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.

解决方案 »

  1.   

    既然楼主知道是哪一行出的问题,为什么不加断点调试一下FKAttend.dll呢,难道是调用的其他人的DLL,无源代码。
      

  2.   

    调用的DLL无问题,问题是我的DLL  被网页掉用的时候才出现的问题
      

  3.   

    调用方式我确定没问题,要不然会出什么EPS之类的东西
      

  4.   

    wchar_t    都改成char  就好了
    不过我这个程序没有返回来加载dll里的指针参数值  不知道什么问题
      

  5.   

    继续求解!我的调用可以传回来值  但是都是0
    估计是调用人家DLL的时候没有返回来值啊
      

  6.   


    好是好了,乱码就出现了。仔细研究BSTR等串转换问题吧。
      

  7.   

    BSTR我做过,也得不到想要的结果,能返回来3个值,都是一样的值,不是正确结果STDMETHODIMP CAttendEx::GetEnrollData(LONG a, LONG b, BSTR* c)
    {
    // 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;
    }个位快帮我看看吧!我都急死了
      

  8.   

    估计你这个是字符串问题,这篇文章你看看,可能有帮助。
    http://www.programbbs.com/doc/186.htm
      

  9.   

    你还要看一下dll的geted函数是否正确修改了你的传入的参数等
      

  10.   

    对,很有可能就是geted没有完成给后三个参数赋值,迷糊……
      

  11.   

    将一个char字符串转换成BSTR
    _com_util::ConvertStringToBSTR()