我使用以下命令创建一个COM对象(来自本机代码)CoCreateInstance
:
const
CLASS_GP2010: TGUID = "{DC55D96D-2D44-4697-9165-25D790DD8593}";
hr = CoCreateInstance(CLASS_GP2010, nil, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, IUnknown, out unk);
Run Code Online (Sandbox Code Playgroud)
实际上,我在Delphi中,这意味着我调用了辅助函数:
CreateComObject(CLASS_GP2010);
Run Code Online (Sandbox Code Playgroud)
大部分时间这个功能都成功了.但有时,在同一个可执行文件中,在同一进程中,调用CoCreateInstance
失败的原因是:
Unspecified error (0x80004005 = E_FAIL)
Run Code Online (Sandbox Code Playgroud)
再次调用该函数可能会成功,或者可能会失败.没有(明显的)押韵或理由.
如果这是一个正常的 COM DLL,我写,我就开始把OutputDebugString
在DLL_ATTACH
,当有人试图打电话DllGetClassObject
,我会确认COM是正确加载我的DLL,并且它被正确要求被实例化的类.
不幸的是,它不是COM dll; 它是一个.NET程序集dll.COM子系统并不是简单地 "加载"我的dll
.相反,COM被指示加载mscoree.dll
:
HKEY_CLASSES_ROOT
CLSID
{DC55D96D-2D44-4697-9165-25D790DD8593}
InprocServer32
@default = mscoree.dll
Run Code Online (Sandbox Code Playgroud)
并mscoree.dll
导出所需的GetClassObject
功能.那mscoree.dll
个人回来了E_FAIL
,不是我.故障永远不会发生在我的开发机器上,但始终在客户机器上间歇性地失败.
问题是,因为mscoree.dll
返回的是E_FAIL
(而不是任何有用的):我如何告诉我问题是什么?
例如,似乎唯一遇到故障的客户(除了是唯一大量使用COM对象的客户)恰好在Windows XP上.也许他们遇到了.NET框架中的已知错误(版本4之前),您无法在同一进程中加载不同版本的.NET运行时 …
我们通过COM(CCW)在本机C++中使用.NET Assembly DLL.每当我制作我的DLL的新版本时,我必须向在其代码中使用它的工作人员发送两个文件(.dll和相应的.tlb).
是否可以将.tlb文件作为.NET DLL文件中的资源嵌入?
通过OLE/COM对象查看器查看由CCW创建的生成的TLB文件显示IID保持不变,除非我更改了界面的设计(这是正确的行为),我担心的是如果我在另一台机器上编译相同的代码尽管接口没有改变,因此将生成完全不同的IID,从而破坏现有的COM客户端.
我有一个.NET服务应用程序的安装项目,它使用一个.NET组件,它公开了一个COM接口(COM可调用包装器/ CCW).要使组件在目标计算机上运行,必须在其中注册
regasm.exe/tlb/codebase component.dll
在这种情况下,生成类型库的/ tlb开关是必需的,否则我无法从该组件创建对象.
问题是,如何配置我的Visual Studio 2008安装项目以通过调用regasm/tlb来注册此程序集?
(defn app [request]
(println "test")
{:body "Hello World"})
(defonce server (run-jetty #'app {:port 8080 :join? false}))
Run Code Online (Sandbox Code Playgroud)
println
似乎在处理程序中不起作用.如何写入REPL窗口?
我逆时针使用eclipse.
编辑:这看起来像nrepl问题.(future (println "foo"))
很好,但没有输出(.start (Thread. #(println "foo")))
.
我想知道是否可以使用COM注册程序集而无需向GAC注册.我们需要部署一些使用CCW暴露给经典asp的.net库.但部署是一场噩梦.
我通常使用Emacs但受到启发再次尝试CCW + Eclipse.我有一个带有源文件src/user.clj的Clojure测试项目,其中包含以下内容:
(ns user)
(println "hi")
Run Code Online (Sandbox Code Playgroud)
我有一个REPL,我开始使用Window-> Show View-> Other-> Clojure Views-> REPL.
当我选择println表达式(全部为'(println"hi")')并按下Command-enter时,表达式本身会在REPL窗口中回显,但不会发生输出.与'(取10(范围))'等表达式相似.
如果我直接在REPL中键入表达式,然后按Enter,我就会得到
=> (take 10 (range))
Run Code Online (Sandbox Code Playgroud)
但似乎没有任何额外的评估结果.
谢谢你的任何想法.我查看了文档,但没有任何明显的东西跳出来.
我在理解 ccw(逆时针)算法时遇到了一些麻烦:
int ccw (Point P0, Point P1, Point P2) {
dx1 = P1.x - P0.x;
dx2 = P2.x - P0.x;
dy1 = P1.y - P0.y;
dy2 = P1.y - P0.y;
if (dy1 * dx2 > dy2 * dx1) return -1;
if (dx1 * dy2 > dy1 * dx2) return 1;
if ((dx1 * dx2 < 0) || (dy1 * dy2 < 0)) return 1;
if ((dx1 * dx1 + dy1 * dy1) < (dx2 * dx2 + dy2 * …
Run Code Online (Sandbox Code Playgroud) ccw ×8
.net ×4
com ×3
clojure ×2
asp-classic ×1
c# ×1
c++ ×1
c++-cli ×1
com-interop ×1
delphi ×1
dll ×1
eclipse ×1
installation ×1
registration ×1
ring ×1