C++ 使用C+注册COM DLL的所有接口+;美国石油学会

C++ 使用C+注册COM DLL的所有接口+;美国石油学会,c++,visual-c++,com,C++,Visual C++,Com,我知道,我们可以使用regsvr32.exe注册COM DLL的接口 是任何可用的Windows C++ API,API将登记COM DLL接口。 谢谢! Vijay Kumbhani所有的regsvr32都是加载一个dll并调用dll公开的函数 如果您想编写自己的代码来执行此操作,那么您需要使用并获取指向函数的指针,然后只需调用它。所有的regsvr32都是加载一个dll并调用dll公开的函数 如果要编写自己的代码来执行此操作,则需要使用和获取指向该函数的指针,然后调用它。您知道CLSID和C

我知道,我们可以使用regsvr32.exe注册COM DLL的接口

是任何可用的Windows C++ API,API将登记COM DLL接口。 谢谢!


Vijay Kumbhani

所有的
regsvr32
都是加载一个dll并调用dll公开的函数


如果您想编写自己的代码来执行此操作,那么您需要使用并获取指向函数的指针,然后只需调用它。

所有的
regsvr32
都是加载一个dll并调用dll公开的函数


如果要编写自己的代码来执行此操作,则需要使用和获取指向该函数的指针,然后调用它。

您知道CLSID和COM dll文件路径吗? 如果是,您可以使用API RegCreateKeyEx/SetKeyValue/RegCreateKeyEx/…将它们写入注册表,下面是一个示例:

[HKEY_CLASSES_ROOT\CLSID\{CLSID}\InprocServer32]
@="C:\\Windows\\System32\\oleaut32.dll"    
"ThreadingModel"="Both"

LONG lreturn = RegCreateKeyEx(
        HKEY_CLASSES_ROOT,
        _T("CLSID\${COMCLSID}"),  // subkey
        0,                        // reserved
        NULL,                     // class string (can be NULL)
        REG_OPTION_NON_VOLATILE,
        KEY_ALL_ACCESS,
        NULL,                     // security attributes
        &hKey,
        NULL                      // receives the "disposition" (is it a new or existing key)
        );
hr = __HRESULT_FROM_WIN32(lreturn);
// The default key value is a description of the object.
if (SUCCEEDED(hr))
{
    hr = SetKeyValue(hKey, NULL, _T("your description"));
}

// Create the "InprocServer32" subkey
if (SUCCEEDED(hr))
{
    const TCHAR *sServer = TEXT("InprocServer32");

    LONG lreturn = RegCreateKeyEx(hKey, sServer, 0, NULL,
        REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hSubkey, NULL);

    hr = __HRESULT_FROM_WIN32(lreturn);
}

if (SUCCEEDED(hr))
{
    hr = SetKeyValue(hSubkey, NULL, _T("${COM DLL file Path}"));
}

// Add a new value to the subkey, for "ThreadingModel" = <threading model>
if (SUCCEEDED(hr))
{
    hr = SetKeyValue(hSubkey, TEXT("ThreadingModel"), sThreadingModel);
}
[HKEY\U CLASSES\U ROOT\CLSID\{CLSID}\InprocServer32]
@=“C:\\Windows\\System32\\oleaut32.dll”
“ThreadingModel”=“两者”
长lreturn=RegCreateKeyEx(
HKEY_类_根,
_T(“CLSID\${COMCLSID}”),//子键
0,//保留
NULL,//类字符串(可以为NULL)
REG\u选项\u非易失性,
钥匙(所有)进入,,
NULL,//安全属性
&香港大学,
NULL//接收“处置”(是新密钥还是现有密钥)
);
hr=来自WIN32的hr结果(lreturn);
//默认键值是对象的描述。
如果(成功(hr))
{
hr=SetKeyValue(hKey,NULL,_T(“您的描述”);
}
//创建“InprocServer32”子项
如果(成功(hr))
{
常量TCHAR*sServer=TEXT(“InprocServer32”);
LONG lreturn=RegCreateKeyEx(hKey,sServer,0,NULL,
REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hSubkey,NULL);
hr=来自WIN32的hr结果(lreturn);
}
如果(成功(hr))
{
hr=SetKeyValue(hSubkey,NULL,_T(“${COM DLL文件路径}”);
}
//为“ThreadingModel”的子项添加新值=
如果(成功(hr))
{
hr=SetKeyValue(hSubkey,TEXT(“ThreadingModel”),sthrreadingmodel);
}

您知道CLSID和COM dll文件路径吗? 如果是,您可以使用API RegCreateKeyEx/SetKeyValue/RegCreateKeyEx/…将它们写入注册表,下面是一个示例:

[HKEY_CLASSES_ROOT\CLSID\{CLSID}\InprocServer32]
@="C:\\Windows\\System32\\oleaut32.dll"    
"ThreadingModel"="Both"

LONG lreturn = RegCreateKeyEx(
        HKEY_CLASSES_ROOT,
        _T("CLSID\${COMCLSID}"),  // subkey
        0,                        // reserved
        NULL,                     // class string (can be NULL)
        REG_OPTION_NON_VOLATILE,
        KEY_ALL_ACCESS,
        NULL,                     // security attributes
        &hKey,
        NULL                      // receives the "disposition" (is it a new or existing key)
        );
hr = __HRESULT_FROM_WIN32(lreturn);
// The default key value is a description of the object.
if (SUCCEEDED(hr))
{
    hr = SetKeyValue(hKey, NULL, _T("your description"));
}

// Create the "InprocServer32" subkey
if (SUCCEEDED(hr))
{
    const TCHAR *sServer = TEXT("InprocServer32");

    LONG lreturn = RegCreateKeyEx(hKey, sServer, 0, NULL,
        REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hSubkey, NULL);

    hr = __HRESULT_FROM_WIN32(lreturn);
}

if (SUCCEEDED(hr))
{
    hr = SetKeyValue(hSubkey, NULL, _T("${COM DLL file Path}"));
}

// Add a new value to the subkey, for "ThreadingModel" = <threading model>
if (SUCCEEDED(hr))
{
    hr = SetKeyValue(hSubkey, TEXT("ThreadingModel"), sThreadingModel);
}
[HKEY\U CLASSES\U ROOT\CLSID\{CLSID}\InprocServer32]
@=“C:\\Windows\\System32\\oleaut32.dll”
“ThreadingModel”=“两者”
长lreturn=RegCreateKeyEx(
HKEY_类_根,
_T(“CLSID\${COMCLSID}”),//子键
0,//保留
NULL,//类字符串(可以为NULL)
REG\u选项\u非易失性,
钥匙(所有)进入,,
NULL,//安全属性
&香港大学,
NULL//接收“处置”(是新密钥还是现有密钥)
);
hr=来自WIN32的hr结果(lreturn);
//默认键值是对象的描述。
如果(成功(hr))
{
hr=SetKeyValue(hKey,NULL,_T(“您的描述”);
}
//创建“InprocServer32”子项
如果(成功(hr))
{
常量TCHAR*sServer=TEXT(“InprocServer32”);
LONG lreturn=RegCreateKeyEx(hKey,sServer,0,NULL,
REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hSubkey,NULL);
hr=来自WIN32的hr结果(lreturn);
}
如果(成功(hr))
{
hr=SetKeyValue(hSubkey,NULL,_T(“${COM DLL文件路径}”);
}
//为“ThreadingModel”的子项添加新值=
如果(成功(hr))
{
hr=SetKeyValue(hSubkey,TEXT(“ThreadingModel”),sthrreadingmodel);
}

Regsvr32.exe是您能想到的最简单的程序。它使用LoadLibrary()加载DLL,使用GetProcAddress()查找DllRegisterServer导出。并称之为,仅此而已。没有提供api,因为它非常简单。Regsvr32.exe是您能想到的最简单的程序。它使用LoadLibrary()加载DLL,使用GetProcAddress()查找DllRegisterServer导出。并称之为,仅此而已。没有提供api,因为它非常简单。