有个信息管理系统,我想写个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;//新增一个
}
但我在主文件中调用时却出现内存错,不能访问;
请问是什么原因,像这样的问题该怎样解决是好???
//----------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;//新增一个
}
但我在主文件中调用时却出现内存错,不能访问;
请问是什么原因,像这样的问题该怎样解决是好???
解决方案 »
- 单文档程序如何在CMainFrame类和CView类同时响应同一个菜单单击的消息函数
- 我的双缓冲哪里出错了?
- scroll的绘制机制是什么
- vc2005编译出现奇怪的错误,还望高手指教
- 如何动态设置data control?
- 谁给我介绍一本既有英文版的又有中文版本的vc++方面的书!我想对照着看看!
- 关于截获并替换系统API函数的技术问题。(关于剪切函数)
- 怎样重设ListCtrl的Item?
- 急问:多线程情况下ExecuteSQL阻塞的问题
- 关于对话框中图象的重绘, 抢分啦!
- 重画CSliderCtrl控件后不能改变控件滑块大小问题?
- 模式识别,图像处理的群,这方面的爱好者请进,群号:6941138
你检查一下是不是这方面的问题
你在.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中的函数。
//--------------------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;
}
类型并不是问题,问题还没解决啊
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得文章,很多的
看看是否加载dll成功了,因为可能不在同一个目录,就需要Dll的绝对路径!
我的dll就在当前exe的目录下;关键是我想利用dll来存储用户信息,是用进程的全局变量,还是内部变量好一些呢