是这样的:我写了一个dll,在exe内调用它的接口时,一直报错。
请大家帮忙看看,问题可能出在哪?dll内是这样的:
extern "C" _declspec(dllexport) void Upload(CString& strBatch, CString& strVersion, THREADDATA* pData, BOOL bReUpload)
//extern "C" _declspec(dllexport) void Upload(CString strBatch, CString strVersion, THREADDATA* pData, BOOL bReUpload=FALSE)

    CDmObject *pDmObj = CDmObject::Instance();
    if( pDmObj ){
        try    {
            pDmObj->Upload(strBatch, strVersion, pData, bReUpload);        
        }
        catch(...){
        }
    }
}
CDmObject的定义大致是这样的:
class CDmObject
{
private:
    static CDmObject* __instance;
public:    
    CDmObject();
    ~CDmObject();    
    static CDmObject* Instance();
 
private:
    BOOL LoadMetaData(CString& strBatch,CString& strVersion,CEcmProcess *pEcmPro);
    BOOL IsBatchExpired(int nStatus);
    BOOL IsCheckOutTimeOut(CString strLastTime);
    int CheckInBySocket(LPCSTR lpBatch);
    BOOL GetConfigValue();
     
public:
 
};exe内的调用:
//THREADDATA* pData;
    THREADDATA* pThreadData=new THREADDATA;
    CoInitialize(NULL);
    (*m_fnUpload)(strBatch, strVersion, pThreadData, bReUpload); //这一步报错,提示“0x7c92100b 处最可能的异常: 0xC0000005: 读取位置 0x00000034 时发生访问冲突”
    CoUninitialize();

解决方案 »

  1.   

    在Upload里面加断点,看看到哪里报错了
      

  2.   

    试过,还没进upload就报错了…
      

  3.   

    m_fnUpload动态加载过来时判断是否是NULL没
      

  4.   

    pDmObj->Upload
    实现函数贴出来看看
      

  5.   


    断点打在这,根本就没走到… 
    打在pDmObj->Upload内部也是[/img][img=http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/40.gif]
      

  6.   

    看下m_fnUpload的定义和赋值部分,另要注意导出函数的调用约定要和导入声明的调用约定一样
      

  7.   

    dll的代码改过一次,但是没有将新编译的dll替换原先的dll,所以才会一直报错。
    替换后就没有问题了。就是接口定义不统一的问题(dll那边最后一个参数有默认值,而exe这边没有)。
    麻烦各位了(o(╯□╰)o
      

  8.   

    估计新老dll是两个编译环境,
    库接口别用那种CString和stdstring,而用char*代替,
    因为不同编译环境CString和stdstring等复杂结构内存分不一定一样