我必须在 C++ DLL 中使用 VB (COM) DLL。
我弄清楚了如何从 C++ DLL 访问 VB (COM) DLL,并且它可以工作。
现在我遇到了一个问题,我必须使用隔离的 COM/免注册 COM,因为我无法在必须使用它的每台 PC 上注册 DLL。
我想出使用清单文件来实现这一点,但我无法让它工作,而且我不知道出了什么问题。
我有一个名为 AccConnVB.dll 的 VB DLL,其中包含以下 AccConnVB.manifest 文件:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1"
manifestVersion="1.0">
<assemblyIdentity
type="win32"
name="AccConnVB"
version="1.0.0.0" />
<clrClass
clsid="{70da7ef0-1549-4b27-9b00-ade5f37aecbe}"
progid="AccConnVB.AccConnVB"
threadingModel="Both"
name="AccConnVB.tables" >
</clrClass>
</assembly>
以及一个名为 AccConn.dll 的 C++ DLL,其中包含以下 AccConn.manifest 文件:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1"
manifestVersion="1.0">
<assemblyIdentity
type = "win32"
name = "AccConn"
version = "1.0.0.0" />
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="AccConnVB"
version="1.0.0.0" />
</dependentAssembly>
</dependency>
</assembly>
我的 C++ DLL#define
s _WIN32_DCOM
在其 stdafx.h 和#import
canon.tlb 是no_namespace
.
以下是 C++ DLL 中的方法:
JNIEXPORT jint JNICALL Java_natives_AccessConnection_refreshImportZwei
(JNIEnv *env, jclass jobj, jstring jDatabase){
jint result;
CComBSTR database;
const char* nativeDatabase = env->GetStringUTFChars(jDatabase,0);
database.Append((LPCSTR) nativeDatabase);
CoInitializeEx(NULL,COINIT_MULTITHREADED);
{
ITablesPtr ptr;
HRESULT hr = ptr.CreateInstance(__uuidof(tables));
if (SUCCEEDED(hr))
{
result = (jint) ptr->refreshImportZwei(BSTR(database));
}
}
CoUninitialize();
}
我确保注册的 AccConnVB.dll 一切正常,但在未注册的计算机上使用它会失败。
通过在 cmd.exe 中使用以下行执行 mt.exe 来嵌入清单文件:mt -manifest H:\AccConnVB.manifest -outputresource:H:\AccConnVB.dll;#1
,分别针对 AccConn.dll 和 AccConn.manifest。
没有其他任何设置,当访问 AccConn.dll 时,AccConnVB.dll、AccConn.manifest 和 AccConnVB.manifest 位于同一文件夹中。
我按照演练进行操作here http://msdn.microsoft.com/en-us/library/ms973915.aspx并尝试了一些变体,但没有任何效果。
提前非常感谢大家!
附件1:
AccConn.清单:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1"
manifestVersion="1.0">
<assemblyIdentity
type = "win32"
name = "AccConn"
version = "1.0.0.0" />
<file name="AccConnVB.dll">
<comClass
clsid="{70da7ef0-1549-4b27-9b00-ade5f37aecbe}"
tlbid="{1CA12FB4-4A5C-41FF-A508-DCC6CE0D26CD}"
progid="AccConnVB.tables" />
<typelib
tlbid="{1CA12FB4-4A5C-41FF-A508-DCC6CE0D26CD}"
version="1.0" helpdir="" />
</file>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="AccConnVB"
version="1.0.0.0" />
</dependentAssembly>
</dependency>
</assembly>
AccConnVB.manifest:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1"
manifestVersion="1.0">
<assemblyIdentity
type="win32"
name="AccConnVB"
version="1.0.0.0" />
</assembly>
附件2:
OfficeConn.manifest - C++-DLL -(更改名称):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<file name="OfficeConn.dll" hashalg="SHA1">
<comClass clsid="{2C0D73B5-7AA4-4D17-970D-042804E206B2}" tlbid="{DB27F83B-DD8E-4AD8-A6A3-9232A9C1692C}">
</comClass>
<typelib tlbid="{DB27F83B-DD8E-4AD8-A6A3-9232A9C1692C}" version="1.0" helpdir="" flags="HASDISKIMAGE">
</typelib>
</file>
<comInterfaceExternalProxyStub name="IOffice" iid="{19485BDA-0BAE-3527-8F9B-C90B43746B03}" tlbid="{DB27F83B-DD8E-4AD8-A6A3-9232A9C1692C}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}">
</comInterfaceExternalProxyStub>
<comInterfaceExternalProxyStub name="_offClass" iid="{1FA5D7FC-1CAE-49E0-A99E-B97E8FE3466E}" tlbid="{DB27F83B-DD8E-4AD8-A6A3-9232A9C1692C}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}">
</comInterfaceExternalProxyStub>
</assembly>
OfficeConnVB.manifest - VB-DLL -(更改名称):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity name="OfficeConnVB" version="1.0.0.0" publicKeyToken="38d072ba2818144d" processorArchitecture="msil">
</assemblyIdentity>
<clrClass clsid="{2c0d73b5-7aa4-4d17-970d-042804e206b2}" progid="OfficeConnVB.offClass" threadingModel="Both" name="OfficeConnVB.offClass" runtimeVersion="">
</clrClass>
<clrSurrogate clsid="{453B8C28-201B-3705-8CF1-C492C7B259EA}" name="Microsoft.Office.Interop.Outlook.OlDefaultFolders">
</clrSurrogate>
<clrSurrogate clsid="{B5181856-6837-3E65-AF7B-5020DD408339}" name="Microsoft.Office.Interop.Outlook.OlItemType">
</clrSurrogate>
<clrSurrogate clsid="{ECE70AEA-B928-3392-AE59-01373B29D3DA}" name="Microsoft.Office.Interop.Outlook.OlImportance">
</clrSurrogate>
<clrSurrogate clsid="{D74B5B88-8D75-3D21-A9BA-F6DBDC905F75}" name="Microsoft.Office.Interop.Word.WdSaveOptions">
</clrSurrogate>
<file name="OfficeConnVB.dll" hashalg="SHA1">
</file>
</assembly>