Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从非托管C++;使用IDispatch? 我有一个C++的DLL,我需要从非托管C++调用。我的主要问题是我的C++代码对应于一个Excel插件,当我在Excel 2007中安装我的外接程序时,可以安装Excel 2003和Excel 2007,我尝试调用我的C语言,它工作得很好,但是由于某种原因,我仍然没有找到,在Excel 2003中崩溃,Excel显示运行时错误信息,当调试我的C++代码时,我可以看到代码在试图创建我的C语言的DLL实例时失败,它说即使我注册了RigASM,该类也没有注册。_C#_C++_Excel_Com_Dll - Fatal编程技术网

C# 如何从非托管C++;使用IDispatch? 我有一个C++的DLL,我需要从非托管C++调用。我的主要问题是我的C++代码对应于一个Excel插件,当我在Excel 2007中安装我的外接程序时,可以安装Excel 2003和Excel 2007,我尝试调用我的C语言,它工作得很好,但是由于某种原因,我仍然没有找到,在Excel 2003中崩溃,Excel显示运行时错误信息,当调试我的C++代码时,我可以看到代码在试图创建我的C语言的DLL实例时失败,它说即使我注册了RigASM,该类也没有注册。

C# 如何从非托管C++;使用IDispatch? 我有一个C++的DLL,我需要从非托管C++调用。我的主要问题是我的C++代码对应于一个Excel插件,当我在Excel 2007中安装我的外接程序时,可以安装Excel 2003和Excel 2007,我尝试调用我的C语言,它工作得很好,但是由于某种原因,我仍然没有找到,在Excel 2003中崩溃,Excel显示运行时错误信息,当调试我的C++代码时,我可以看到代码在试图创建我的C语言的DLL实例时失败,它说即使我注册了RigASM,该类也没有注册。,c#,c++,excel,com,dll,C#,C++,Excel,Com,Dll,这是我的C#代码: 在C++中,我做的是导入当我使用ReGASM登记我的C ydll DLL时生成的.tLB文件,像这样: \#import "..\bin\release\ManagedDLL.tlb" raw_interfaces_only using namespace ManagedDLL; . . . int callMyDll() { long handle = 0, result = 0; BSTR args; HRESULT hr = CoInitia

这是我的C#代码:

在C++中,我做的是导入当我使用ReGASM登记我的C ydll DLL时生成的.tLB文件,像这样:


\#import "..\bin\release\ManagedDLL.tlb" raw_interfaces_only
using namespace ManagedDLL;
.
.
.
int callMyDll()
{
    long handle = 0, result = 0;
    BSTR args;

    HRESULT hr = CoInitialize(NULL);

    ICalculatorPtr pICalc(__uuidof(COMEntryPoint));

    pICalc->main(bstrStr, handle, &result);

    return result;
}
但正如我前面提到的,此代码不适用于excel 2003,因此我的问题是:

  • 我在声明我的C#dll时犯了一些错误,这在Excel2003中给我带来了问题
  • 就像现在一样,我的C#dll可以被视为ActiveX对象吗
  • 如何从C++中调用我的C语言?比如使用IDIspatch
    谢谢,我以前也遇到过类似的问题。我并没有从C++调用Cype,但是这个概念是相同的。p> 我必须通过COM将.NET dll加载到主机应用程序中,这看起来就像您正在尝试做的。问题是主机应用程序(在您的示例中是excel)正在加载.NET运行时1.1。我们的dll是为.NET2.0编译的

    可能是Excel 2003正在加载1.1运行时,而2007加载的是更新的版本。请在以下位置查看此论坛:


    你也可以通过使用1.1个运行时来测试这个,然后尝试在Excel 2003中加载你的DLL。< /P> < P>我不是C++程序员,所以我不能评论这一部分,而是从C边回答:

    “我在做错事 我声明我的C#dll的方式是 是否在excel 2003中给我带来问题?”

    不,您的属性用法看起来完全正确。干得好

    “就像现在一样,我的C#dll可以 是否认为是ActiveX对象?”

    通过使用您显示的属性进行编译,然后通过RegAsm注册,您已经创建并正确地向COM公开了您想要的程序集。(术语“ActiveX”通常用于引用COM控件,而您的类不是控件。)

    “我如何在另一个系统中调用我的C#dll C++的方式? 榜样。”

    您正在使用
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    属性,这意味着该接口通过IDispatch同时暴露于早期绑定和后期绑定

    简而言之,我不知道这里出了什么问题,所以我会尝试dequadin的想法来检查正在加载的.NET Framework版本是否位于或高于正在构建的框架

    如果不是这样的话,我能想到的另一件事是,在没有可恢复错误的情况下,直接发生崩溃,这向我表明,注册接口与编译调用方的接口之间可能存在某种不一致。发生这种情况的原因是,如果您更改接口,GUID不会更改--您已经通过属性显式设置了GUID--因此,如果接口发生更改,而所有内容都没有从下到上重新构建和注册,那么所有的麻烦都会爆发。因此,如果您以任何方式更改了接口,那么您需要重新构建C++组件,重新登记RigASM,然后重新编译C++引用,即引用它。 这只是我最好的猜测。并且,如果您对每个问题使用相同的精确程序集,则不会解释Excel 2003与2007的问题。简言之,很难知道出了什么问题,因为您的C#代码看起来100%干净


    --Mike

    是的,问题正是你所怀疑的,excel正在加载1.1运行时,所以你在那篇文章中建议的修复方法工作得很好,或者还有另一篇文章讨论了同样的问题,可能会对某些人有所帮助。
    
    \#import "..\bin\release\ManagedDLL.tlb" raw_interfaces_only
    using namespace ManagedDLL;
    .
    .
    .
    int callMyDll()
    {
        long handle = 0, result = 0;
        BSTR args;
    
        HRESULT hr = CoInitialize(NULL);
    
        ICalculatorPtr pICalc(__uuidof(COMEntryPoint));
    
        pICalc->main(bstrStr, handle, &result);
    
        return result;
    }