如何使我的程序在2000中也能运行?
我的程序用到了一个XP系统文件CRYPTUI.dll,
XP的这个dll比2000中的要新,现在我的程序在2000中无法运行,如何解决?具体是这样的:
我的程序用到了函数CryptUIDlgSelectCertificateFromStore,
该函数相应的Requirements:
Client: Included in Windows XP.
Server: Included in Windows Server 2003.
Header: Declared in CryptuiAPI.h.
Library: Use CryptUI.lib.我在XP上编译程序可以运行,但是在2000中就不能运行了,显示错误信息:
无法定位程序输入点CryptUIDlgSelectCertificateFromStore
于动态链接库CRYPTUI.dll上。有什么办法可以使程序在2000中也可以运行?
最好不要告诉我:要更新2000中的这个CRYPTUI.dll,
因为我试图更新过,更新不了,文件正在使用...
有没有别的途径?总之,怎么才能在2000中也能运行,谢谢各位关照!
我的程序用到了一个XP系统文件CRYPTUI.dll,
XP的这个dll比2000中的要新,现在我的程序在2000中无法运行,如何解决?具体是这样的:
我的程序用到了函数CryptUIDlgSelectCertificateFromStore,
该函数相应的Requirements:
Client: Included in Windows XP.
Server: Included in Windows Server 2003.
Header: Declared in CryptuiAPI.h.
Library: Use CryptUI.lib.我在XP上编译程序可以运行,但是在2000中就不能运行了,显示错误信息:
无法定位程序输入点CryptUIDlgSelectCertificateFromStore
于动态链接库CRYPTUI.dll上。有什么办法可以使程序在2000中也可以运行?
最好不要告诉我:要更新2000中的这个CRYPTUI.dll,
因为我试图更新过,更新不了,文件正在使用...
有没有别的途径?总之,怎么才能在2000中也能运行,谢谢各位关照!
解决方案 »
- error C2440: “static_cast”: 无法从“LRESULT (__thiscall CCalendarConvDlg::* )(void)”
- 有两个文档视图类,通过菜单切换怎么解决,有源码吗?加分
- CReBar加入了一个CToolBar,一个CDialogBar,怎样动态的把CDialogBar删除?
- 在线程中调用其他函数为什么会出现异常?
- 在VC.NET 2003 中,DATAGrid控件 怎么设置显示列及设置列宽
- _stdcall 和_cdecl的区别
- 怎样退出程序?
- 一个简单菜单禁用/启用问题,在线等
- 有没有养条插值的算法呢? 要求出2个点中间的所有点.
- 中断错误,莫名其妙,挠头中,高人指教~~~~~~~~~
- 请教:我现在win2kpro上装了VS.NET,现在可不可以再装vs6?
- 请教: 一个Windows消息能否同时被多个不同的消息函数响应?谢谢
---具体怎么弄啊,我不知道怎么打包,请教教我,谢谢关照!
---开玩笑,这是一个很复杂的设计UI和数字证书的函数,
自己写得出来我就不用调用DLL了,
HELP!
---我试过,好像不行;
还是把dll放在EXE目录, 然后自己LoadLibrary读这个函数不就可以了
---怎么LoadLibrary啊,我没用过,请教教我,谢谢关照!
GetProcAddress用于确定动态装载的dll库中某个函数的地址以实现调用
----------------以下是动态装载DLL并运行函数的代码,参考一下------------------
要装载MAPI,用户必须程序运行时动态的装载一个动态链接库。LoadLibrary函数提供了此功能,它定位一个动态链接库,并返回HINSTANCE局柄(需要保存该句柄)。 LoadLibrary的语法如下:
LoadLibrary ( lpLibFileName );
其中lpLibFileName为LPCTSTR结构变量,
是所要调用的库的路径和名称。 程序示例:
// 调用MAPI32.DLL并计算函数地址
HINSTANCE hInstMail;
hInstMail = ::LoadLibrary ( “MAPI32.DLL” );
if ( hInstMail == NULL )
{
// 错误处理
// 受篇幅限制,下面的错误处理部分省略
} 3-1-2 确定函数地址 ---- 由于MAPI32.DLL是被动态装载的,因此不知道所要调用的函数地址,也就不能一开始就调用它们,而要通过函数名获得函数的地址,并在动态链接库中查找每一个函数并核实。因此首先必须为这些函数声明指针 程序示例:
// 为MAPI32.DLL中的函数声明函数指针
ULONG (PASCAL *lpfnMAPISendMail) (LHANDLE lhSession,
ULONG ulUIParam, lpMapiMessage lpMessage,
FLAGS flFlags, ULONG ulReserved);
ULONG (PASCAL *lpfnMAPIResolveName) (LHANDLE lhSession,
ULONG ulUIParam, LPTSTR lpszName,
FLAGS ulFlags, ULONG ulReserved,
lpMapiRecipDesc FAR *lppRecip);
ULONG (FAR PASCAL *lpfnMAPILogon)(ULONG ulUIParam,
LPSTR lpszProfileName, LPSTR lpszPassword,
FLAGS flFlags, ULONG ulReserved,
LPLHANDLE lplhSession);
ULONG (FAR PASCAL *lpfnMAPILogoff)(LHANDLE lhSession,
ULONG ulUIParam, FLAGS flFlags,
ULONG ulReserved);
ULONG (FAR PASCAL *lpfnMAPIFreeBuffer)(LPVOID lpBuffer);
ULONG (FAR PASCAL *lpfnMAPIAddress)(LHANDLE lhSession,
ULONG ulUIParam, LPSTR lpszCaption,
ULONG nEditFields, LPSTR lpszLabels,
ULONG nRecips, lpMapiRecipDesc lpRecips,
FLAGS flFlags, ULONG ulReserved,
LPULONG lpnNewRecips,
lpMapiRecipDesc FAR *lppNewRecips);
ULONG (FAR PASCAL *lpfnMAPIFindNext)(LHANDLE lhSession,
ULONG ulUIParam, LPSTR lpszMessageType,
LPSTR lpszSeedMessageID, FLAGS flFlags,
ULONG ulReserved, LPSTR lpszMessageID);
ULONG (FAR PASCAL *lpfnMAPIReadMail)(LHANDLE lhSession,
ULONG ulUIParam, LPSTR lpszMessageID,
FLAGS flFlags, ULONG ulReserved,
lpMapiMessage FAR *lppMessage); ---- 为了决定每一个函数的地址,必须为每一个函数调用GetProcAddress。 GetProcAddress的语法为:
GetProcAddress (hModule, lpProcName);
其中,hModule为HMODULE结构,是所调用DLL模块的句柄;
lpProcName为LPCSTR结构,是函数名称。 程序示例:
// 找到MAPI32.DLL函数的地址,并将它们保存在函数指针变量里
(FARPROC&) lpfnMAPISendMail = GetProcAddress(hInstMail,
“MAPISendMail”);
(FARPROC&) lpfnMAPIResolveName = GetProcAddress(
hInstMail, “MAPIResolveName”);
(FARPROC&) lpfnMAPILogon = GetProcAddress(hInstMail,
“MAPILogon”);
(FARPROC&) lpfnMAPILogoff = GetProcAddress(hInstMail,
“MAPILogoff”);
(FARPROC&) lpfnMAPIFreeBuffer = GetProcAddress(
hInstMail, “MAPIFreeBuffer”);
(FARPROC&) lpfnMAPIAddress = GetProcAddress(hInstMail,
“MAPIAddress”);
(FARPROC&) lpfnMAPIFindNext = GetProcAddress(hInstMail,
“MAPIFindNext”);
(FARPROC&) lpfnMAPIReadMail = GetProcAddress(hInstMail,
“MAPIReadMail”);
HINSTANCE mydll; //定义一个dll模块句柄
mydll = LoadLibrary ("CRYPTUI.dll")//装入这个dll,给出相对或绝对路径指向你新的DLL
(FARPROC&) myproc = GetProcAddress(mydll, "CryptUIDlgSelectCertificateFromStore"); //这段是将DLL中这个函数地址取出,这样才能使用这个函数