有个信息管理系统,我想写个DLL来对用户ID和密码进行管理(新增,存储,修改,验证),在DLL中我想用STL中的map来存储,文件大致如下:
//----------dll.h---------
map<string,string> userdata;bool validate(string userID,string password);//验证
void insert_new_user(string userID,string password)//添加用户……
//----------dll.cpp----------
bool validate(string userID,string password)
{
……
}
void insert_new_user(string &userID,string &password)
{
      userdata[userID] = password;//新增一个
}
但我在主文件中调用时却出现内存错,不能访问;
请问是什么原因,像这样的问题该怎样解决是好???

解决方案 »

  1.   

    小弟初步接触DLL,请大家多多指教~~~
      

  2.   

    最简单和保险的方法就是在dll的导出函数中只使用c的数据类型
      

  3.   

    STL的绝对能用,我就经常用,不过你是用COM实现吗?还有map的key不能重复的,
    你检查一下是不是这方面的问题
      

  4.   

    DllMain()都没有!
    你在.def文件里声明了输出函数没有?
    是动态加载还是静态加载?
    动态的请你还要声明_declspec(dllexport),声明它是一个输出函数呢!例extern "C" _declspec(dllexport) int Max(int a, int b);申明它是一个输出函数(适用动态加载)该动态链接库编译成功后,打开MyDll工程中的debug目录,可以看到MyDll.dll、MyDll.lib两个文件。LIB文件中包含DLL文件名和DLL文件中的函数名等,该LIB文件只是对应该DLL文件的"映像文件",与DLL文件中,LIB文件的长度要小的多,在进行隐式链接DLL时要用到它。读者可能已经注意到在MyDll.h中有关键字"extern C",它可以使其他编程语言访问你编写的DLL中的函数。
      

  5.   

    谢谢大家,我的源程序如下:
    //--------------------dll.hpp-------------
    #include <string>
    #include <map>#ifdef __cplusplus
    #define EXPORT extern "C" __declspec (dllexport)
    #else
    #define EXPORT __declspec (dllexport)
    #endif
    using namespace std;
    EXPORT bool validate(string userID,string password);
    map<string,string> userdata;
    //----------------------dll.cpp-----------------
    BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
     )
    {
    switch(ul_reason_for_call) 
    {
    case DLL_PROCESS_ATTACH:
    userdata["cxc"] = "123";  //初始化一个
    cout << "Initialized" << endl;
    break;
    case DLL_THREAD_ATTACH:
    break;
    case DLL_THREAD_DETACH:
    break;
    case DLL_PROCESS_DETACH:
    cout << "distroyed!";
    break;
    }    return TRUE;
    }
    void insert_new_user(string &userID,string &password)
    {
    userdata[userID] = password;
    return;
    }
    EXPORT bool validate(string userID,string password)
    {
    map<string,string>::iterator iter;
    iter = userdata.find(userID);
    if (iter != userdata.end())
    {
    if (userdata[userID] == password)
    return true;
    else 
    return false;
    }
    else
    insert_new_user(userID,password);
    return true;
    }
    //-------------main.cpp-----------------
    #include<iostream>
    #include<string>
    #include<windows.h>
    #include "wfoodll.hpp"
    using namespace std;
    typedef bool (*MYFUN)(string,string); 
    bool validate(string userID,string password);
    int main()
    {
        MYFUN pf;
        string userID,password;
        cout << "Input your Username:";
        cin >> userID;
        cout << "\nOutput your password:";
        cin >> password;
         HINSTANCE pd =  ::LoadLibrary("wfoodll.dll");
        if (pd != NULL)
            pf = (MYFUN) ::GetProcAddress(pd,"validate");
        if ( pf(userID,password) == true)
            cout << "\nHello,welcome";
        else
            cout << "\nThe password is wrong";
        cout << endl;
        ……
        system("pause");
        return 0;
    }
      

  6.   

    各位高手帮我看看是怎么回事啊,我一输入cxc   123  就内存出错,我已经初始化了啊
      

  7.   

    你去看看map 的用法。。userdata[userID] = password;//新增一个userdata.insert("ccx","123") 我觉得定义为 map<int, string>更有意义吧。。
      

  8.   

    但我输入cxc  123 时并不会执行新增操作噻;
    类型并不是问题,问题还没解决啊
      

  9.   

    调用一个DLL函数方法
    typedef DWORD (WINAPI *Proc)(DWORD param1,DWORD param2);
    Proc fProc=NULL;
    HMODULE hModule = ::GetModuleHandle(TEXT("kernel32.dll"));
    fProc=(Proc)::GetProcAddress(hModule, "API函数");静态得也可以,加入lib,.h文件另外看看你的动态连接库对不对,有没有用
    extern "C" __declspec(dllexport)搜索一下关于DLL得文章,很多的
      

  10.   

    建议你在HINSTANCE pd =  ::LoadLibrary("wfoodll.dll");这句话后面加个if(pd==NULL){测试语句}
      看看是否加载dll成功了,因为可能不在同一个目录,就需要Dll的绝对路径!
      

  11.   

    To: FinalInches(无色枫叶) ( ) 信誉:100 
    我的dll就在当前exe的目录下;关键是我想利用dll来存储用户信息,是用进程的全局变量,还是内部变量好一些呢
      

  12.   

    我刚才把string改为了char* 结果调试通过了难道是Dll的函数接口真的不支持非C类型,如果确实要用到非C类型,有什么好的解决办法没有啊????
      

  13.   

    我知道是为什么,因为map里用到了静态成员,所以不能将map在dll之间交互使用,明白了吗?