gpt4 book ai didi

c++ - 动态加载 Leadtools DLL

转载 作者:太空宇宙 更新时间:2023-11-04 13:10:28 25 4
gpt4 key购买 nike

我正在使用 Leadtools 17.5。如果我将 Leadtools Dll 静态链接到我的 64 位 C++ 应用程序,然后调用 L_SetLicenseBuffer 一切正常,返回值为零。但出于安全原因,最终产品不允许将这些DLL添加到System32文件夹中,也不允许更改系统路径,并且由于多个应用程序正在使用我要安装的工具在一个公共(public)文件夹中(例如 C:\Program Files\Common Files\LeadTools\17.5)并使用 AddDllDirectory将路径添加到 DLL 搜索路径。所以我决定在运行时动态加载 DLL。所以我为这个函数创建了一个定义:

typedef L_INT (EXT_FUNCTION* TL_SetLicenseBuffer)(L_UCHAR* pLicenseBuffer, L_SSIZE_T nSize, L_TCHAR* pszDeveloperKey);
typedef L_BOOL (EXT_FUNCTION* TL_IsSupportLocked)(L_UINT uType);

然后像这样创建了一个函数指针:

TL_SetLicenseBuffer pfSetLicenseBuffer = NULL;
TL_IsSupportLocked pfIsSupportLocked = NULL;

然后将 DLL 所在的路径添加到 DLL 搜索路径:

AddDllDirectory(LEAD_DLL_PATH);
AddDllDirectory(LEAD_FILTER_PATH);

并将 DLL 的默认目录搜索路径设置为用户定义的:

SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_USER_DIRS);

然后加载DLL,得到我需要的函数地址:

HINSTANCE hKrn = LoadLibrary(L"ltkrnx.dll");
pfSetLicenseBuffer = (TL_SetLicenseBuffer)GetProcAddress(hKrn, "L_SetLicenseBuffer");
pfIsSupportLocked = (TL_IsSupportLocked)GetProcAddress(hKrn, "L_IsSupportLocked");

现在,如果我使用与以前相同参数的函数指针,该函数将失败并返回 -13 并且任何后续调用例如 pfIsSupportLocked 都会显示 nag 对话框:

retCode = pfSetLicenseBuffer(pLicenseData, LicSize, pKeyStr); // retCode is -13
pfIsSupportLocked(L_SUPPORT_DOCUMENT); // Shows nag dialog

有谁知道我该如何解决这个问题?

谢谢
山姆

最佳答案

您需要做的第一件事是检查调试器输出,并通过验证路径确保您期望加载的 DLL 是加载的 DLL。您的搜索路径中可能有多个版本的 LTKRNX.DLL。我在这里测试了你的代码,它返回了成功:

typedef L_INT (EXT_FUNCTION* TL_SetLicenseBuffer)(L_UCHAR* pLicenseBuffer, L_SSIZE_T nSize, L_TCHAR* pszDeveloperKey);
typedef L_BOOL (EXT_FUNCTION* TL_IsSupportLocked)(L_UINT uType);

HINSTANCE hKrn = LoadLibrary(L"ltkrnx.dll");
TL_SetLicenseBuffer pfSetLicenseBuffer = NULL;
TL_IsSupportLocked pfIsSupportLocked = NULL;

pfSetLicenseBuffer = (TL_SetLicenseBuffer)GetProcAddress(hKrn, "L_SetLicenseBuffer");
pfIsSupportLocked = (TL_IsSupportLocked)GetProcAddress(hKrn, "L_IsSupportLocked");

L_INT retCode = pfSetLicenseBuffer(szLICAnsi, _countof(szLICAnsi), pKeyStr);
if(retCode == SUCCESS)
bRet = pfIsSupportLocked(L_SUPPORT_DOCUMENT);
else
printf("Problem!");

此外,PaulMcKenzie 建议的是另一种验证您对 LoadLibrary 的调用是否正常工作的方法。如果您仍然无法解决问题,您可以联系我们的技术支持,以帮助您解决此问题:support@leadtools.com

关于c++ - 动态加载 Leadtools DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40226165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com