我有一个用vb6编写的COM dll.当我尝试从此dll创建类模块的新对象时,我得到一个运行计时器错误430:类不支持自动化或不支持预期的接口.有趣的是,这只发生在IDE外部,当我在IDE中进行调试时,没有抛出错误,并且成功创建了类的新对象.可能是什么原因?
一般来说,我偶尔会在COM dll中遇到这些错误.调试COM问题的最佳方法是什么?如何知道程序运行时正在使用的dll的路径?
我想以编程方式检索任何类的接口ID,以便将其传递给CoCreateInstance.很感谢任何形式的帮助!!
请参阅下面的"我如何获得此":
HRESULT hResult;
CLSID ClassID;
void *pInterface;
if(!(hResult = SUCCEEDED(CoInitialize(NULL))))
{
return 1;
}
if(S_OK == CLSIDFromProgID(OLESTR("Scripting.FileSystemObject"), &ClassID))
{
hResult = CoCreateInstance(ClassID, NULL, CLSCTX_INPROC_SERVER,
<<How Do I Get This?>>, (LPVOID *)&pInterface);
}
CoUninitialize();
Run Code Online (Sandbox Code Playgroud)
编辑:感谢所有的帮助,现在似乎完美的工作!:
HRESULT hResult;
CLSID ClassID;
IClassFactory *pClf;
void *pVdb;
if(!(hResult = SUCCEEDED(CoInitialize(NULL))))
{
return 1;
}
if(SUCCEEDED(CLSIDFromProgID(OLESTR("Scripting.FileSystemObject"), &ClassID))
{
IDispatch *pDispatch;
if(SUCCEEDED(CoCreateInstance(ClassID, NULL, CLSCTX_INPROC_SERVER,
IID_IDispatch, (void **)&pDispatch))
{
OLECHAR *sMember = L"FileExists";
DISPID idFileExists;
if(SUCCEEDED(pDispatch->GetIDsOfNames(
IID_NULL, &sMember, 1, LOCALE_SYSTEM_DEFAULT, &idFileExists))
{
unsigned int puArgErr = 0; …Run Code Online (Sandbox Code Playgroud) 我正在研究一个C++应用程序来读取Excel文件中的一些数据.我有它的工作,但我对一部分感到困惑.这是代码(简化为只读取第一个单元格).
//Mostly copied from http://www.codeproject.com/KB/wtl/WTLExcel.aspx
#import "c:\Program Files\Common Files\Microsoft Shared\OFFICE11\MSO.DLL"
#import "c:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB"
#import "C:\Program Files\Microsoft Office\Office11\excel.exe" rename ("DialogBox","ExcelDialogBox") rename("RGB","ExcelRGB") rename("CopyFile", "ExcelCopyFile") rename("ReplaceText", "ExcelReplaceText") exclude("IFont", "IPicture")
_variant_t varOption((long) DISP_E_PARAMNOTFOUND, VT_ERROR);
int _tmain(int argc, _TCHAR* argv[])
{
DWORD dwCoInit = 0;
CoInitializeEx(NULL, dwCoInit);
Excel::_ApplicationPtr pExcel;
pExcel.CreateInstance(_T("Excel.Application"));
Excel::_WorkbookPtr pBook;
pBook = pExcel->Workbooks->Open("c:\\test.xls", varOption, varOption, varOption, varOption, varOption, varOption, varOption, varOption, varOption, varOption, varOption, varOption);
Excel::_WorksheetPtr pSheet = pBook->Sheets->Item[1];
Excel::RangePtr pRange = pSheet->GetRange(_bstr_t(_T("A1")));
_variant_t vItem = pRange->Value2;
printf(_bstr_t(vItem.bstrVal));
pBook->Close(VARIANT_FALSE);
pExcel->Quit();
//CoUninitialize(); …Run Code Online (Sandbox Code Playgroud) 我正在尝试设置免注册COM,但有一个小问题,我可能是另一个COM对象客户端.
App.exe -----> COM服务器/客户端DLL(已注册与否)--------> COM服务器DLL(未注册)
我的问题是,是否可以为第二个dll(COM服务器/客户端DLL)创建清单?我无法控制可执行文件,但如果我这样做,如果我为可执行文件创建客户端清单并为COM服务器dll创建服务器清单,则此方法有效.
这是中间dll的清单文件.我尝试嵌入它并在外部尝试它.仍然无法正常工作.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity type="win32"
name="COMCliSer.dll"
version="1.0.0.0"
/>
<dependency>
<dependentAssembly>
<assemblyIdentity
name="COMSer.dll"
version="1.0.0.0"
/>
</dependentAssembly>
</dependency>
</assembly>
Run Code Online (Sandbox Code Playgroud)
在进一步的调查中,只要中间dll也是免费注册并且exe有一个应用程序清单,我就可以全部工作.一旦我注册了中间的dll,并删除了应用程序清单(我无法控制exe将使用我的dll),整个过程就停止了.
如果exe没有清单,那么不会考虑dll的清单.我可以通过设置一切工作来证明这一点.然后在程序集清单中输入错误.这会弹出通常的消息:
无法创建进程:此应用程序无法启动,因为应用程序配置不正确.重新安装应用程序可能会解决此问题.
如果我然后删除应用程序清单,则应用程序加载(尽管CoCreateInstance失败,因为不考虑依赖关系)
我的同事试图通过RegAsm.exe注册一些COM组件(我写的),并说它需要管理员权限.他的帐户具有管理员权限,但他未以管理员身份登录.有没有办法使用他的常规用户帐户并成功完成此任务?
我刚刚"获得"在我目前的工作中维护用C#编码的遗留库的特权.
这个dll:
更直观,据我了解组件:
*[Big legacy system in Uniface]* == [COM] ==> [C# Library] == [托管API] ==> *[Big EDM Management System]*
问题是:这个C#库中的一个方法运行时间太长而且我"应该"使它异步!
我习惯了C#,但根本不习惯COM.我已经完成了并发编程,但是COM似乎增加了很多复杂性,到目前为止我所有的试验都结束了:
我没有关于如何在COM DLL中处理线程的想法和资源,我将不胜感激任何提示或帮助.
到目前为止,代码的最大部分我已经改变,使我的方法异步:
// my public method called by the external system
public int ComparedSearch(string application, out string errMsg) {
errMsg = "";
try {
Action<string> asyncOp = AsyncComparedSearch;
asyncOp.BeginInvoke(application, null, null);
} catch (ex) {
// ...
}
return 0;
}
private int AsyncComparedSearch(string application) {
// my actual method …Run Code Online (Sandbox Code Playgroud) 我相信读取Outlook .msg文件(为了获取主题,附件等额外元数据)的唯一方法是使用Outlook API - Application.Session.OpenSharedItem()方法.
如果是这种情况,那么我正在寻找在我们的应用服务器上运行此代码的方法,该服务器没有安装MS OFfice或MS Outlook.我收到了错误
System.ArgumentException: progId not found. Outlook.Application
Run Code Online (Sandbox Code Playgroud)
这当然是由于缺少Outlook应用程序.
有没有办法只安装一个DLL或什么,以使OpenSharedItem方法工作?如果可能的话,我不想安装完整的客户端.
或者,有没有办法解析.msg文件而不需要像Outlook这样的重要依赖项?
我想使用Python从Office/Excel文档中添加和提取文件.到目前为止添加东西很容易但是为了提取我还没有找到一个干净的解决方案.
为了清楚我已经得到了什么,我没有写下下面的小例子test.py并进一步解释.
test.py
import win32com.client as win32
import os
from tkinter import messagebox
import win32clipboard
# (0) Setup
dir_path = os.path.dirname(os.path.realpath(__file__))
print(dir_path)
excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = excel.Workbooks.Open(dir_path + "\\" + "test_excel.xlsx")
ws = wb.Worksheets.Item(1)
objs = ws.OLEObjects()
# (1) Embed file
f = dir_path + "\\" + "test_txt.txt"
name = "test_txt_ole.txt"
objs.Add( Filename=f, IconLabel=name )
# (2) Access embedded file
obj = objs.Item(1) # Get single OLE from OLE list
obj.Copy()
win32clipboard.OpenClipboard()
data = win32clipboard.GetClipboardData(0xC004) # Binary …Run Code Online (Sandbox Code Playgroud)