我有兴趣在我必须使用.NET dll的项目中使用/学习RoR.Ruby能否导入.NET dll?
有人可以解释PVOID在以下函数中使用的是什么以及如何使用它:
BOOL DoSomething(PVOID pMemPhy)
Run Code Online (Sandbox Code Playgroud) 我需要处理一个文件夹中的一些dll和exe文件,并确定我正在处理的文件类型:.NET,COM,Win32或其他一些外来生命形式.
我一直在尝试确定检测DLL类型的最简单方法,你怎么看待这个:
COM dll =>我做了一个LoadLibrary,然后是" DllRegisterServer "的GetProcAddress .如果我得到有效的回报,那就是一个COM文件.
.NET dll =>如果dll依赖于MSCOREE.DLL,它总是一个.NET dll?
Win32 dll =>如果上述测试都失败了,那就是Win32 dll?
当然必须有更好的方法来检测我们正在处理的dll类型.以上是非常笨重的,并不适用于EXE文件?必须有一些我没想到的其他方式.
理想情况下,我希望能够让解析器确定编译文件的编译器,以及它使用的功能,如MFC,Atl,Stl等......但我怀疑在预反射时代是否可行?
假设我有一个实现两个或更多COM接口的类:
class CMyClass : public IInterface1, public IInterface2 {
};
Run Code Online (Sandbox Code Playgroud)
几乎我看到的每个文档都表明,当我为IUnknown实现QueryInterface()时,我明确地将此指针向上转换为其中一个接口:
if( iid == __uuidof( IUnknown ) ) {
*ppv = static_cast<IInterface1>( this );
//call Addref(), return S_OK
}
Run Code Online (Sandbox Code Playgroud)
问题是为什么我不能复制这个?
if( iid == __uuidof( IUnknown ) ) {
*ppv = this;
//call Addref(), return S_OK
}
Run Code Online (Sandbox Code Playgroud)
文档通常说如果我执行后者,我将违反对同一对象上的QueryInterface()的任何调用必须返回完全相同的值的要求.
我不太明白.难道他们的意思是,如果我QI()用于IInterface2和调用QueryInterface()通过该指针C++将通过此略有不同,如果我QI()用于IInterface2因为C++每次都会使这点到子对象?
我知道几个相似之处..
两者都不能自己执行.它需要一些程序来实例化它.
COM DLL和ActiveX控件是平台独立的.(是这样吗...?)
双方需要支持该接口IUnknown,并公开三个方法QueryInterface,AddRef和Release.
它还需要在使用之后注册,并在完成之后注册.
但他们有什么不同?有人可以列出来吗?
另外我的理解是ActiveX控件是OLE自定义控件(OCX).我听说过像ActiveX DLL这样的术语.它是ActiveX控件的另一种形式还是不同的东西?
我正在编写一个函数,使用VB .NET中的Office Interop将数据导出到Excel.我目前正在使用Excel工作表的Cells()方法直接编写单元格:
worksheet.Cells(rowIndex, colIndex) = data(rowIndex)(colIndex)
Run Code Online (Sandbox Code Playgroud)
这需要很长时间才能获得大量数据.是否有更快的方法可以立即将大量数据写入Excel?用范围做事会更快吗?
这是(潜在的)问题:
我创建一个COM对象,然后使用'foreach'迭代它返回的集合中的每个元素.我是否需要释放我在集合中迭代的每个元素?(参见下面的代码.)如果是这样的话,我无法想出一种有效地从'finally'语句中释放它的方法,以防万一在项目被操作时出现错误.
有什么建议?
private static void doStuff()
{
ComObjectClass manager = null;
try
{
manager = new ComObjectClass();
foreach (ComObject item in manager.GetCollectionOfItems())
{
Log.Debug(item.Name);
releaseComObject(item); // <-- Do I need this line?
// It isn't in a 'finally' block...
// ...Possible memory leak?
}
}
catch (Exception) { }
finally
{
releaseComObject(manager);
}
}
private static void releaseComObject(object instance)
{
if (instance != null)
{
try
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(instance);
}
catch
{
/* log potential memory leak */
Log.Debug("Potential memory …Run Code Online (Sandbox Code Playgroud) 我在ASP.net,c#中开发了一个Web服务,并在IIS上托管,由vba客户端使用.下载了Office 2003 Web Services 2.01工具包后,我遇到了成功创建所需代理类的问题(许多用户在线记录),并决定创建一个.net DLL库.我创建了一个库,它引用了Web服务并将其中一个方法暴露给c#中的公共函数.
我现在有三个问题:
如何在VBA中引用dll类?我试图去工具 - >引用并浏览到dll位置,但是我收到错误"无法添加对指定文件的引用".磁盘上是否有特定位置我必须复制.dll?
我还可以复制dll文件旁边的dll.config文件,以便在那里使用端点URL吗?
由于要调用的方法是接受一个对象(由各种成员和几个List <>成员组成,这些如何在VBA代码中实现?
因此,在此之后,我决定在专用的STA线程上显式实例化COM对象.实验表明COM对象需要一个消息泵,我通过调用它来创建Application.Run():
private MyComObj _myComObj;
// Called from Main():
Thread myStaThread = new Thread(() =>
{
_myComObj = new MyComObj();
_myComObj.SomethingHappenedEvent += OnSomthingHappened;
Application.Run();
});
myStaThread.SetApartmentState(ApartmentState.STA);
myStaThread.Start();
Run Code Online (Sandbox Code Playgroud)
如何从其他线程发布STA线程的消息泵消息?
注意: 为了简洁起见,我对问题进行了大量编辑.@Servy的答案的某些部分现在似乎无关紧要,但它们是针对原始问题的.
com ×10
.net ×3
dll ×3
c# ×2
c++ ×2
windows ×2
activex ×1
com-interop ×1
excel ×1
file ×1
interop ×1
memory-leaks ×1
performance ×1
pointers ×1
ruby ×1
sta ×1
vb.net ×1
vba ×1
visual-c++ ×1
winapi ×1