如何使我的程序在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中也能运行,谢谢各位关照!

解决方案 »

  1.   

    能不能判断当前的系统然后使用对应的dll
      

  2.   

    主要是2000的CRYPTUI.dll没有那个函数CryptUIDlgSelectCertificateFromStore,
      

  3.   

    把那个DLL考到与EXE相同的目录下试试
      

  4.   

    就是更新掉系统的dll啊,文件正在使用的话就到安全模式下更新,安全模式下也更新不了的话就用启动盘到dos下面替换如果楼主不想更换的话,也可以用打包工具打包一下试试看不过说不定“把那个DLL考到与EXE相同的目录下试试”就可以了
      

  5.   

    “把那个DLL考到与EXE相同的目录下试试”这个我试过,好像不行;“如果楼主不想更换的话,也可以用打包工具打包一下试试看”
    ---具体怎么弄啊,我不知道怎么打包,请教教我,谢谢关照!
      

  6.   

    自已声明,
    ---开玩笑,这是一个很复杂的设计UI和数字证书的函数,
    自己写得出来我就不用调用DLL了,
      

  7.   

    楼主还没解决吗?在我看只有要求使用者使用特定系统或升级到最新了。不过你有试过将这个dll在dos下替换掉旧的正常使用吗?如果可以的话应该倒好办,我记得有个什么东西可以解除文件保护,你专门发贴问一下吧。
      

  8.   

    除了让用户更新这个DLL,没有别的方法了吗?
    HELP!
      

  9.   

    把DLL放在你的EXE的目录, windows首先在EXE所在目录找DLL加载的.上面方法不行的话, 还是把dll放在EXE目录, 然后你自己LoadLibrary读这个函数不就可以了
      

  10.   

    把DLL放在EXE的目录
    ---我试过,好像不行;
    还是把dll放在EXE目录, 然后自己LoadLibrary读这个函数不就可以了
    ---怎么LoadLibrary啊,我没用过,请教教我,谢谢关照!
      

  11.   

    LoadLibrary函数用于动态装载一个dll库
    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”); 
      

  12.   

    晕~~把下面这个代码添加到你的程序中去
    HINSTANCE mydll; //定义一个dll模块句柄
    mydll = LoadLibrary ("CRYPTUI.dll")//装入这个dll,给出相对或绝对路径指向你新的DLL
    (FARPROC&) myproc = GetProcAddress(mydll, "CryptUIDlgSelectCertificateFromStore"); //这段是将DLL中这个函数地址取出,这样才能使用这个函数