是否要用模块文件,怎么使用啊?
类似于此,错误在哪?
LIBRARY      "aecppc"EXPORTS
    InitAEC @ 1
    SaveSample @ 2
    AECFilter @ 3
;  此处可以是显式导出
DLL和调用程序仅能编译通过,我也将dll靠到了对应目录下
但是一运行,就提示找不到dll
请各位指点.多谢!
在线等

解决方案 »

  1.   

    有没有用extern"C"修饰函数 ?
      

  2.   

    在命令行状态下使用dumpbin命令查看发泄函数名字都没有改变,可是运行的时候还是找不到,怎么回事啊?
      

  3.   

    C++__stdcall + .def 导出 
    or
    extern "C" __cdecl把你的dll弄过来看看 可是运行的时候还是找不到
    //什么提示。
      

  4.   

    那你把文件复制到system32目录下。试试看
      

  5.   

    暴露代码:
    LIBRARY      "aecppc" EXPORTS 
        InitAEC @ 1 
        SaveSample @ 2 
        AECFilter @ 3 
    接口代码:
    [DllImport("aecpppc.dll")]
                public static extern int CSaveSample(double[] buf);
                [DllImport("aecpppc.dll")]
                public static extern int CAECFilter(double[] buf);
    DLL库中:
    extern BOOL CInitAEC()
    {
    theApp->InitAEC();
    return true;
    }extern BOOL CSaveSample(double *buf)
    {
    theApp->SaveSample(buf);
    return true;
    }
    extern BOOL CAECFilter(double *buf)
    {
        theApp->AECFilter(buf);
    return true;
    }解决即送分,请大家指教!
      

  6.   

    补充函数代码:
    BOOL CaecppcApp::InitAEC()
    {
        if ((m_pNearEndBuf = new double[sizeof(double)*FRAME_SIZE]) == NULL )
            return FALSE;    if ((m_pE = new double[sizeof(double)*FRAME_SIZE]) == NULL )
            return FALSE;    if ((m_pFIRBuf = new double[sizeof(double)*(TAP_NUM+SOUNDCARD_DELAY+FRAME_SIZE)]) == NULL )
            return FALSE;    if ((m_pTap = new double[sizeof(double)*TAP_NUM]) == NULL )
            return FALSE;    if ((m_pTap_Old = new double[sizeof(double)*TAP_NUM]) == NULL )
            return FALSE;    ZeroMemory(m_pNearEndBuf,sizeof(double)*FRAME_SIZE);
        ZeroMemory(m_pFIRBuf,sizeof(double)*(TAP_NUM+SOUNDCARD_DELAY+FRAME_SIZE));
        ZeroMemory(m_pTap,sizeof(double)*TAP_NUM);
        ZeroMemory(m_pTap_Old,sizeof(double)*TAP_NUM);
        ZeroMemory(m_pE,sizeof(double)*FRAME_SIZE);    InitializeCriticalSection(&m_Aec_Critical_Section);    m_nBufCount = 0;    
        m_FarEnergy = 0.0;
        m_FarZCR = 0.0;
        m_NearEnergy = 0.0;
        m_NearZCR = 0.0;
        m_Ee = 0.0;
        m_dNMD[0]=0.0;m_dNMD[1]=0.0;
        m_dGRAD_NMD = 0.0;    m_bFarEndActive = FALSE;
        m_nFarEndSilenceCount = 0;
        m_bDoubleTalk = FALSE;
        m_nDoubleTalkCount = 0;
        m_nUnStableCount =0;    return TRUE;
    }//////////////////////////////////////////////////////////////////////
    // Save one frame of remote voice sample and
    // calculate the parameters
    // return: TRUE = Remote ACTIVE, mean remote user is speaking
    //    FALSE= Remote UNACTIVE, mean remote user is not speaking
    //////////////////////////////////////////////////////////////////////
    BOOL CaecppcApp::SaveSample(double *buf)
    {
        int i;    EnterCriticalSection(&m_Aec_Critical_Section);    // The bug content
        //  FIR Register Soundcard delay New samples
        // |____________|______________|___|
        // |    |                          |
        //     \
        // 
        CopyMemory((m_pFIRBuf+TAP_NUM+SOUNDCARD_DELAY),buf,sizeof(double)*FRAME_SIZE);      for (i=0;i<FRAME_SIZE;i++)  
            *(m_pFIRBuf+TAP_NUM+SOUNDCARD_DELAY+i) *= AMPL_SCALE_1;    FarEndPreFilter( m_pFIRBuf+TAP_NUM+SOUNDCARD_DELAY);    m_FarEnergy = FrameEnergy(m_pFIRBuf,FRAME_SIZE+TAP_NUM);
        m_FarZCR = FrameZCR(m_pFIRBuf,FRAME_SIZE+TAP_NUM);    if (m_FarEnergy>SILENCE_ENERGY_THRESHOLD && m_FarZCR>SLIENCE_ZCR_NUM) 
            m_nFarEndSilenceCount = 0;
        else
        {   
            m_nFarEndSilenceCount++;
            m_nFarEndSilenceCount &= 0xFF;  
        }
        if (m_nFarEndSilenceCount<MAX_SILENCES)
            m_bFarEndActive = TRUE;
        else
        {
            m_bFarEndActive = FALSE;
            m_nDoubleTalkCount = 0;
        }    LeaveCriticalSection(&m_Aec_Critical_Section);    return m_bFarEndActive;
    }//////////////////////////////////////////////////////////////////////
    // Input one frame of local voice. Do AEC to this frame
    // Return: TRUE = double-talk
    //         FALSE= no double-talk
    //////////////////////////////////////////////////////////////////////
    BOOL CaecppcApp::AECFilter(double *buf)
    {
        int i;    EnterCriticalSection(&m_Aec_Critical_Section);    CopyMemory(m_pNearEndBuf,buf,sizeof(double)*FRAME_SIZE);    for (i=0;i<FRAME_SIZE;i++)
            *(m_pNearEndBuf+i) *= AMPL_SCALE_1;    NearEndPreFilter(m_pNearEndBuf);    m_NearEnergy = FrameEnergy(m_pNearEndBuf,FRAME_SIZE);
        m_NearZCR = FrameZCR(m_pNearEndBuf,FRAME_SIZE);    if (m_bFarEndActive )
        {   
            m_bDoubleTalk = NLMS();        for (i=0;i<FRAME_SIZE;i++)
                *(m_pE+i) *= AMPL_SCALE_2;          CopyMemory(buf,m_pE,sizeof(double)*FRAME_SIZE);
        }    MoveMemory(m_pFIRBuf,m_pFIRBuf+FRAME_SIZE,sizeof(double)*(TAP_NUM+SOUNDCARD_DELAY));    ZeroMemory((m_pFIRBuf+TAP_NUM+SOUNDCARD_DELAY),sizeof(double)*FRAME_SIZE);    LeaveCriticalSection(&m_Aec_Critical_Section);    return m_bDoubleTalk;
    }
      

  7.   

    问题解决,一是因为函数没有从类里面剥离,二是因为下载的时候应该用静态MFC库。