- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我将OCX库从VS2010 / Win7升级到VS2019 / Win10。该项目生成,但是当我尝试从提升的命令提示符下使用RegSvr32.exe
时,收到错误0x0040200。我做了一些调试,令人讨厌的调用是对AfxOleRegisterTypeLib
的调用。
是的,我看到了this SO文章,内容为“dll附近没有tlb文件”。其他搜索状态从管理命令提示符运行。
我在OCX控件附近没有TLB。如果我尝试使用tlbexp.exe
创建一个,则会出现以下错误:
TlbExp : error TX0000 : Could not load file or assembly 'file:///C:\pathto.ocx' or one of its dependencies. The module was expected to contain an assembly manifest.
"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7.2 Tools\x64\tlbexp.exe" /VERBOSE "<path to OCX file>" /out:"<path to .tlb output file>"
Resource Tuner
,它很好地显示了 list 。 list 没有任何TLB信息。
TlbExp
获得其所需信息的信息,只是一个想法。
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="DriveOps.ocx"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />
<!-- Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />
<!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
</application>
</compatibility>
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
</windowsSettings>
</application>
</assembly>
Depends64
(又名
Dependency Walker 64-bit
),并且没有缺少的组件DLL。它很好地找到了所有这些文件,就像RegSvr32.exe一样。
Ipp
前缀是Intel Code Composer Studio重新分发(x64)文件(此处为2011年版本)所使用的DLL,这是一个较旧的文件,需要更新为最新和最大的文件,更不用说现在的免费API。这些都在System32
文件夹中。 // DllRegisterServer - Adds entries to the system registry
STDAPI DllRegisterServer(void)
{
AFX_MANAGE_STATE(_afxModuleAddrThis);
if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
return ResultFromScode(SELFREG_E_TYPELIB); // <- failure line, through debugging
if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))
return ResultFromScode(SELFREG_E_CLASS);
return NOERROR;
}
Intel Code Composer Studio 2011
文件位于
C:\Windows\System32
目录中。
TlbExp
在Win7框上也失败了,只是注册了,这可能就是UI可以添加控件的原因。我记得,我曾经在Win7项目上替换过OCX,而VS201 0 auto 创建了TLB,并在前面加上了Ax,但这是几年前的事,所以我的记忆可能不是最准确的。尝试将OCX添加到UI(.Net WinForms)失败了,只是说无法添加。
Visual Studio 2019 (v142)
)。
regasm.exe
是.Net汇编的注释。
RegSvr32.exe
用于
ActiveX Controls (OCX/DLL)
,这就是我所拥有的。 RegSvr32用于动态加载的模块,因此适用于DllRegister入口点。
TlbExp.exe
失败,并显示了与我的真实项目相同的错误消息。我去添加新物品,看到了“包装 list ”。该 list 文件尽管仍会产生相同的TlbExp.exe错误,但与上面的应用程序 list 文件看起来有很大不同。我创建了另一个新的MFC ActiveX Control
项目,并从上面添加了 list ,只是更改了名称,然后看到该项目拒绝构建并抛出1)错误c1010001属性“level”的值在不同的 list 片段中不相等。和2)在运行mt.exe期间LNK1327失败。这告诉我原始的Win7项目和我的Win10项目文件中可能有一些错误,否则VS应该向我抛出了这些错误。这不能回答为什么即使在测试项目上TlbExp.exe
也会失败的原因。 list 中的某些属性可能是必需的。我只是保留了默认值。 <?xml version="1.0" encoding="utf-8"?>
<!-- TODO: Make sure to set the Package attributes -->
<Package xmlns="urn:Microsoft.WindowsPhone/PackageSchema.v8.00"
Owner=""
OwnerType="OEM"
Platform=""
Component=""
SubComponent="Package"
ReleaseType="Test" >
<Components>
<Driver InfSource="$(_RELEASEDIR)$(TARGETNAME).inf">
<Reference Source="$(_RELEASEDIR)$(TARGETNAME)$(TARGETEXT)" />
<Files>
<!-- For kernel mode drivers, $(DRIVER_DEST) evaluates to "drivers" by default -->
<!-- For user mode drivers, $(DRIVER_DEST) evaluates to "drivers\umdf" by default -->
<File Source="$(_RELEASEDIR)$(TARGETNAME)$(TARGETEXT)" DestinationDir="$(runtime.system32)\$(DRIVER_DEST)" />
</Files>
</Driver>
</Components>
</Package>
LoadLibrary(dll)
,然后调用GetProcAddress(module, "DllRegisterServer")
以查看哪个失败。好吧,就我而言,这两个功能都成功了。这意味着作者错过了另一个失败分支,这两个API调用并不是RegSvr32.exe
唯一要做的。 最佳答案
尽管我还没有走到尽头,但由于OCX上存在aximp.exe
/ tlbimp.exe
问题,所以我发现了导致我无法注册ActiveX控件的问题。
答案是主CPP文件中的GUID
:
(我正在做研究,因为我找不到任何人解释RegSvr32.exe
的工作原理和作用。我想与大家分享,希望它对其他人有帮助。)
const GUID CDECL _tlid = { 0xFE5C7D88,0xD53C,0x4977,{0xBA,0x56,0x4B,0xF3,0x02,0x0A,0x5D,0x8A} };
STDAPI DllRegisterServer(void)
中使用的代码必须与IDL中存在的
GUID
匹配:
[uuid(FE5C7D88-D53C-4977-BA56-4BF3020A5D8A), version(1.0),
helpfile("DriveOps.hlp"),
helpstring("DriveOps ActiveX Control module"),
control]
library DriveOpsLib
{
...
}
STDAPI DllRegisterServer(void)
{
AFX_MANAGE_STATE(_afxModuleAddrThis);
HINSTANCE hiTypeLib = AfxGetInstanceHandle();
if (!AfxOleRegisterTypeLib(hiTypeLib, _tlid))
return ResultFromScode(SELFREG_E_TYPELIB);
if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))
return ResultFromScode(SELFREG_E_CLASS);
return NOERROR;
}
if (!AfxOleRegisterTypeLib(hiTypeLib, _tlid))
RegSvr32.exe
的源代码。它是位于
GitHub
中的Microsoft
VCSamples-master
源的一部分。
RegSvr32.exe
:
here
DllRegisterServer
入口点来完成所有工作。我应该知道这一点,但是,好吧,我必须看到它才有意义。
procmon.exe
并没有发现任何问题,并且对注册表的各种调用就像阅读外语一样,没有帮助。
AfxOleRegisterTypeLib
的源代码,因为那是失败的。我想看看这件事做了什么,以及源文件
ctlreg.cpp
的第113行是什么。
procmon
的注释和注册表问题,但我认为该代码可以告诉我哪个。我花了一些时间进行研究,但发现了
code。我喜欢Microsoft共享代码。他们的错误消息没有帮助,但是能够真正看到他们试图这样做的情况完全有帮助。
BOOL AFXAPI AfxOleRegisterTypeLib(HINSTANCE hInstance, REFGUID tlid,
LPCTSTR pszFileName, LPCTSTR pszHelpDir)
{
USES_CONVERSION;
BOOL bSuccess = FALSE;
CString strPathName;
TCHAR *szPathName = strPathName.GetBuffer(_MAX_PATH);
::GetModuleFileName(hInstance, szPathName, _MAX_PATH);
strPathName.ReleaseBuffer();
LPTYPELIB ptlib = NULL;
// If a filename was specified, replace final component of path with it.
if (pszFileName != NULL)
{
int iBackslash = strPathName.ReverseFind('\\');
if (iBackslash != -1)
strPathName = strPathName.Left(iBackslash+1);
strPathName += pszFileName;
}
if (SUCCEEDED(LoadTypeLib(T2COLE(strPathName), &ptlib)))
{
ASSERT_POINTER(ptlib, ITypeLib);
LPTLIBATTR pAttr;
GUID tlidActual = GUID_NULL;
if (SUCCEEDED(ptlib->GetLibAttr(&pAttr)))
{
ASSERT_POINTER(pAttr, TLIBATTR);
tlidActual = pAttr->guid;
ptlib->ReleaseTLibAttr(pAttr);
}
// Check that the guid of the loaded type library matches
// the tlid parameter.
ASSERT(IsEqualGUID(tlid, tlidActual));
if (IsEqualGUID(tlid, tlidActual))
{
// Register the type library.
if (SUCCEEDED(RegisterTypeLib(ptlib, T2OLE((LPTSTR)(LPCTSTR)strPathName), T2OLE((LPTSTR)pszHelpDir))))
bSuccess = TRUE;
}
RELEASE(ptlib);
}
else
{
TRACE1("Warning: Could not load type library from %s\n", (LPCTSTR)strPathName);
}
return bSuccess;
}
ASSERT
,因此尽管第113行确实在非代码行上,但实际失败是显而易见的。我知道我没有在
ASSERT_POINTER
上失败,因为该错误消息是不同的,这意味着我失败了:
ASSERT(IsEqualGUID(tlid, tlidActual));
GUID
值,其中一个是顶部的
_tlid
,另一个是从实例句柄返回的值。我拿出了方便的
TextPad
文本编辑器,尽管
Visual Studio
具有
Find in Files
,但是TextPad更加易于使用。这导致了整个解决方案中的另一个实例,即
DriveOps.idl
。直到那一刻,该文件对我都没有任何意义,但是突然我发现这里的
GUID
是
RegSvr32.exe
从实例句柄中提取的。
RegSvr32.exe
不再抱怨了。是的,自从我有了代码后,除了注册外别无选择。据我所知,它不修改注册表是一个不同的故事和问题,但这是另一个问题。
RegSvr32.exe
现在注册,无需投诉。
tlbimp.exe
,
aximp.exe
,并将OCX项目添加到我的
WinForms
项目问题中,但是在过程中我发现了这件事并学到了一些东西。我猜行号的不同可能是Microsoft对 header 所做的一些更改,无论哪种方式,功能看起来都是一样的。)
关于c++ - OCX AfxOleRegisterTypeLib失败,错误0x80040200,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58036192/
问题故障解决记录 -- Java RMI Connection refused to host: x.x.x.x .... 在学习JavaRMI时,我遇到了以下情况 问题原因:可
我正在玩 Rank-N-type 并尝试输入 x x .但我发现这两个函数可以以相同的方式输入,这很不直观。 f :: (forall a b. a -> b) -> c f x = x x g ::
这个问题已经有答案了: How do you compare two version Strings in Java? (31 个回答) 已关闭 8 年前。 有谁知道如何在Java中比较两个版本字符串
这个问题已经有答案了: How do the post increment (i++) and pre increment (++i) operators work in Java? (14 个回答)
下面是带有 -n 和 -r 选项的 netstat 命令的输出,其中目标字段显示压缩地址 (127.1/16)。我想知道 netstat 命令是否有任何方法或选项可以显示整个目标 IP (127.1.
我知道要证明 : (¬ ∀ x, p x) → (∃ x, ¬ p x) 证明是: theorem : (¬ ∀ x, p x) → (∃ x, ¬ p x) := begin intro n
x * x 如何通过将其存储在“auto 变量”中来更改?我认为它应该仍然是相同的,并且我的测试表明类型、大小和值显然都是相同的。 但即使 x * x == (xx = x * x) 也是错误的。什么
假设,我们这样表达: someIQueryable.Where(x => x.SomeBoolProperty) someIQueryable.Where(x => !x.SomeBoolProper
我有一个字符串 1234X5678 我使用这个正则表达式来匹配模式 .X|..X|X. 我得到了 34X 问题是为什么我没有得到 4X 或 X5? 为什么正则表达式选择执行第二种模式? 最佳答案 这里
我的一个 friend 在面试时遇到了这个问题 找到使该函数返回真值的 x 值 function f(x) { return (x++ !== x) && (x++ === x); } 面试官
这个问题在这里已经有了答案: 10年前关闭。 Possible Duplicate: Isn't it easier to work with foo when it is represented b
我是 android 的新手,我一直在练习开发一个针对 2.2 版本的应用程序,我需要帮助了解如何将我的应用程序扩展到其他版本,即 1.x、2.3.x、3 .x 和 4.x.x,以及一些针对屏幕分辨率
为什么案例 1 给我们 :error: TypeError: x is undefined on line... //case 1 var x; x.push(x); console.log(x);
代码优先: # CASE 01 def test1(x): x += x print x l = [100] test1(l) print l CASE01 输出: [100, 100
我正在努力温习我的大计算。如果我有将所有项目移至 'i' 2 个空格右侧的函数,我有一个如下所示的公式: (n -1) + (n - 2) + (n - 3) ... (n - n) 第一次迭代我必须
给定 IP 字符串(如 x.x.x.x/x),我如何或将如何计算 IP 的范围最常见的情况可能是 198.162.1.1/24但可以是任何东西,因为法律允许的任何东西。 我要带198.162.1.1/
在我作为初学者努力编写干净的 Javascript 代码时,我最近阅读了 this article当我偶然发现这一段时,关于 JavaScript 中的命名空间: The code at the ve
我正在编写一个脚本,我希望避免污染 DOM 的其余部分,它将是一个用于收集一些基本访问者分析数据的第 3 方脚本。 我通常使用以下内容创建一个伪“命名空间”: var x = x || {}; 我正在
我尝试运行我的test_container_services.py套件,但遇到了以下问题: docker.errors.APIError:500服务器错误:内部服务器错误(“ b'{” message
是否存在这两个 if 语句会产生不同结果的情况? if(x as X != null) { // Do something } if(x is X) { // Do something } 编
我是一名优秀的程序员,十分优秀!