我正在尝试编写ActiveX控件,并注意到我似乎无法在Visual Basic(6.0)中创建一个ActiveX控件,它具有稍微复杂的控件.像标签,按钮和复选框这样的简单控件似乎工作正常,但是一旦我尝试将树控件添加到我的表单中,一旦我将其嵌入到另一台计算机上的某个主机应用程序中,ActiveX控件就会一直保持空白.它在我的开发盒上工作正常.
在浏览Projects-> Components(Ctrl + T)列表时,我发现了两个显然包含树控件的库:
只要我将这些库中的任何控件添加到我的表单中,当嵌入到另一台计算机上时,该表单将保持完全灰色.另一台计算机是一个Windows XP系统,所以我希望丢失的可再发行组件不会成为一个问题,因为Visual Basic 6有多大.可以肯定的是,我安装了VB6可再发行组件,但不幸的是,这并没有什么区别.
有没有人知道为什么我的ActiveX控件会在其他计算机上保持灰色,但不是我的,只要我将上述库中的任何控件添加到我的表单中?FWIW我只需要树控制,所以如果有其他更合适的库可用 - 这对我来说没问题.
更新:
事实证明,它有助于将MSCOMCTL.OCX下载到另一台计算机上的C:\ WINDOWS\SYSTEM32中,然后通过注册它regsvr32 C:\WINDOWS\SYSTEM32\MSCOMCTL.OCX.但是,我没有找到此文件的官方来源,并且手动运行COM注册看起来很麻烦.真的没有我可以使用的可再发行组件吗?
我有一个用托管代码(C++/CLI)编写的COM对象.我在标准C++中使用该对象.
当COM对象被释放时,如何强制立即调用COM对象的析构函数?如果那是不可能的,请调用我有Release()调用我的COM对象上的MyDispose()方法?
我的代码声明对象(C++/CLI):
[Guid("57ED5388-blahblah")]
[InterfaceType(ComInterfaceType::InterfaceIsIDispatch)]
[ComVisible(true)]
public interface class IFoo
{
void Doit();
};
[Guid("417E5293-blahblah")]
[ClassInterface(ClassInterfaceType::None)]
[ComVisible(true)]
public ref class Foo : IFoo
{
public:
void MyDispose();
~Foo() {MyDispose();} // This is never called
!Foo() {MyDispose();} // This is called by the garbage collector.
virtual ULONG Release() {MyDispose();} // This is never called
virtual void Doit();
};
我使用该对象的代码(本机C++):
#import "..\\Debug\\Foo.tlb" ... Bar::IFoo setup(__uuidof(Bar::Foo)); // This object comes from the .tlb. setup.Doit(); setup->Release(); // explicit release, not really necessary since …
我已经读过一些模糊的陈述,即虚拟继承不提供COM所需的内存结构,因此我们必须使用普通继承.发明虚拟继承来处理钻石问题.
有人能告诉我这两种继承方法之间存储结构细节差异的说明吗?而虚拟继承不适合COM 的关键原因.一张照片最好.
非常感谢.
在COM中如何验证指向COM对象的指针在另一端是否仍然具有有效对象?
我有一个问题,下面的一些代码试图检查m_pServer指针是否仍然存活,但是当该应用程序暴露该接口时,这段代码会崩溃应用程序.任何人都可以建议如何在使用之前检查指针?
if (FAILED(m_pServer->StillAlive())) { // do something }
Run Code Online (Sandbox Code Playgroud)
如果m_pServer不再在内存中,则此代码将失败.
编辑:
EXCEPTION:Client40.exe中0x7728fbae(kernel32.dll)的第一次机会异常:0x800706BA:RPC服务器不可用.
CALL STACK:
kernel32.dll!RaiseException() + 0x58
rpcrt4.dll!RpcRaiseException() + 0x3e
rpcrt4.dll!NdrProxyErrorHandler() + 0x28
rpcrt4.dll!NdrProxySendReceive() + 0xa4
rpcrt4.dll!NdrProxySendReceive() + 0x119
rpcrt4.dll!NdrComplexArrayMarshall() + 0x26d
--> Client40.exe!SlaveDriver::run() Line 97 + 0x14 C++ //Runs while loop, to handle requests
Client40.exe!DThread::tfunc(void * thisptr=0x0047e694) Line 56 + 0xd C++
Client40.exe!_threadstartex(void * ptd=0x01b20e00) Line 241 + 0xd C
kernel32.dll!BaseThreadInitThunk() + 0x12
ntdll.dll!RtlInitializeExceptionChain() + 0x63
ntdll.dll!RtlInitializeExceptionChain() + 0x36
Run Code Online (Sandbox Code Playgroud) 我有一个需要操作大量内存的DLL,并且必须使用x64才能执行此操作,但是调用它的应用程序是x86,无法转换为x64.COM已经用于应用程序和dll之间的交互.
是否有可能为此目的使用代理过程?
我知道在相反的情况下可以做这样的事情(在x64应用程序中运行x86 COM库),会有什么区别吗?
我在我的C++程序中使用MFC(使用Visual Studio 2008).我必须在我的程序开始时调用AfxGetInstanceHandle().
此函数触发断点:
AFXWIN_INLINE HINSTANCE AFXAPI AfxGetInstanceHandle()
{ ASSERT(afxCurrentInstanceHandle != NULL);
return afxCurrentInstanceHandle; }
Run Code Online (Sandbox Code Playgroud)
ASSERT语句失败.afxCurrentInstanceHandle在我们尝试访问它之前,是否需要执行一些特殊操作才能初始化它?
PS:我在共享dll中使用MFC.
编辑
我的代码是这样的:
int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL);
AfxGetInstanceHandle();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想使用它来InstanceHandle初始化a CComModule然后用它来操作com对象.
我正在编写一个小型DLL组件,需要访问两个第三方组件来组合数据,其中一个仅为32位,另一个仅为64位.两者都使用TypeLib注册并且与Automation兼容,因此编组不应成为问题.
如果我正确理解了文档,那么除非组件也有AppID和DllSurrogate键,否则无法强制加载代理.由于两者都是第三方组件,我有点不愿意修改他们的注册.
有没有办法在理论上没有任何额外依赖关系的DLL组件的代理进程中激活组件中没有AppID的对象,或者任何人都可以向我解释为什么这会是一个坏主意?
我刚刚发现我可以使用CreateObject方法从VBA创建一些.Net类,它可以创建COM类.这非常酷,但是创建的类是后期绑定的,所以你没有获得任何intellisense等.所以我希望做的是编写VBA包装类并将所有方法调用委托给.Net对象的内部引用.
因此,除了尝试引用枚举器之外,这适用于所有内容的ArrayList对象.有一个VBA的黑客攻击,它允许您创建自己的集合并使用For Each ...语法来枚举您的集合.以下是一个例子:
Public Property Get NewEnum() As IUnknown
Attribute NewEnum.VB_UserMemId = -4
Attribute NewEnum.VB_MemberFlags = "40"
Set NewEnum = <<< pass a reference to the enumerator here.
End Property
Run Code Online (Sandbox Code Playgroud)
大多数实现都包含对VBA Collection对象的引用,并传递Collection对象的枚举器.但是,由于我持有.Net ArrayList,我想将其传递出去.但是,当我尝试时,我得到"无效的过程调用或参数".
我目前的尝试是这样的:
Public Function NewEnum() As IUnknown
Dim enumerator As Object
Set enumerator = internalList.GetEnumerator() <<<< Error occurs here.
Set NewEnum = enumerator
End Function
Run Code Online (Sandbox Code Playgroud)
我很确定它可以实现这个功能,因为可以在没有包装器的情况下直接迭代ArrayList集合.例如
Public Sub TestCreateArrayList()
Dim list As Object
Set list = CreateObject("System.Collections.ArrayList")
list.Add "an item."
list.Add "another item."
Dim Item As Variant …Run Code Online (Sandbox Code Playgroud) 我在白天管理和组织了许多文件,SendTo是我在Windows上使用最常用的功能.
默认情况下,当用户单击上下文菜单的项目/链接以发送文件时,操作系统不会显示任何类型的通知/通知程序,指示文件正在复制到所选目标.
我认为这是一个非常错误的设计问题,因为对于大文件,它可以......显示进度条,但如果文件很小,它将不会显示任何进度条/可视指示器,因此无法确保文件被复制(没有手动操作)因为我是人类,我可以通过错误点击SendTo上下文菜单外部.
因此,我想开发一个个人迷你工具,当我使用上下文菜单中的SendTo功能发送/复制文件时,只有SendTo功能,这将帮助我优化我的时间向我显示通知窗口.
简单来说,我想从SendTo菜单中检测复制/发送操作,以确保点击在菜单项上正确完成(而不是在菜单外),同时提供其他基本信息,如源文件夹,目标文件夹,以及文件或文件路径的数量.
是否有任何想法开始朝着正确的方向开发这个工具?
我将非常感谢C#或VB.Net中的代码示例,最好是最后一个.
由于我不知道如何开始这样做,我的意思是哪种拦截SendTo调用是最容易或最有效的方式,首先我想挂钩CopyFile或CopyFileEx API函数,但它们不提供我需要的信息因为该函数将在任何类型的复制操作中调用,而不仅仅是在我使用SendTo功能时,所以我迷路了.
我不确定我是否应该调查更多有关内部调用的内容,或者可能会更多地调查windows contextmenu本身,而不是弄乱我可以避免的函数钩子和丑陋的东西.
我的主要想法是开发一个隐藏的WinForms(或者是一个Windows服务),当我使用SendTo功能时(当我点击SendTo菜单的一个项目时)在后台等待,然后显示任何类型的可视指示器.屏幕,以确保我正确地点击该菜单项,并可能告知我正在移动的文件数量以及我正在移动它们的位置.
这是一个代码示例,我认为它演示了如何实例化SendTo com对象来创建自己的?,但是它是用c ++编写的,我不确定该示例是否有用,因为我的目的不是替换SendTo菜单而是我会在这里保留这个有用的信息它为其他东西提供服务:
如何在命名空间扩展中添加(启用)标准"发送到"上下文菜单选项
该KNOWNFOLDERID常数文档提供了有关一些有用的信息的SendTo文件夹中,我再次不知道这也许可以帮助读/访问监测方法?我只是不停的信息在这里:
GUID:{8983036C-27C0-404B-8F08-102D10DCFD74}
默认路径:%APPDATA%\ Microsoft\Windows\SendTo
旧版默认路径:%USERPROFILE%\ SendTo
在Shell扩展处理程序文档中有一个Copy钩子处理程序,我不知道它是否与SendTo的COM组件有关系,如果这可以在某种程度上帮助我,对IContextMenu :: InvokeCommand方法引用同样无知也许我可以拦截它来识别SendTo调用?
到目前为止我觉得自己是盲目的.
我最近发现这是一个托管的"发送到"菜单类,但它又是一个用C/C++编写的例子(我认为之前是相同的源代码),我完全不理解,我不确定这是否有帮助我,因为我重申,取代 …
我正在尝试将第三方COM dll加载到我的应用程序中.一切都很好,但是当我运行应用程序时,我不断从我的应用程序中收到此消息:
无法加载文件或程序集""程序集",Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'或其依赖项之一.需要一个强名称的程序集.(来自HRESULT的异常:0x80131044).
当我这样做时,sn -vf "assembly"它说集会是有效的.以前有没有人见过这种行为?