c#net环境下添加tlb引用失败,怎么回事

c#net环境下添加tlb引用失败,怎么回事,第1张

发生这种问题主要是没有将typelib信息写到注册表,只要调用RegisterTypeLibServer函数则可添加相关信息,参考下面代码。

以下宏定义是我为了简化com控件开发定义的。

//-----------------------------------------------------------------

//EXPORTS

//

//DllGetClassObject PRIVATE

//DllCanUnloadNow PRIVATE

//DllRegisterServerPRIVATE

//DllUnregisterServer PRIVATE

//-----------------------------------------------------------------

#pragma once

#include <assert.h>

#include <tchar.h>

#include <strsafe.h>

#include <Shlwapi.h>

#include "streams.h"

#include <atlbase.h>

#pragma comment(lib,"winmm.lib")

//Node:If

you reference baseclass library,runtime library must use mt or mtd

mode,because usually we compile baseclass in mt/mtd mode.

#if defined(DEBUG) || defined(_DEBUG)

#pragma comment(lib,"strmbasd.lib")

#else

#pragma comment(lib,"strmbase.lib")

#endif

#define BEGIN_COM_DECLARE /

extern HMODULE g_hModule = NULL/

CFactoryTemplate g_Templates[] = /

{

#define END_COM_DECLARE(clsid,version,libraryname) /

}/

const int CLSID_STRING_SIZE = 39 /

void CLSIDtoString(const CLSID&clsid, TCHAR* szCLSID, int length)/

{/

assert(length >= CLSID_STRING_SIZE) /

LPOLESTR wszCLSID = NULL /

HRESULT hr = StringFromCLSID(clsid, &wszCLSID) /

assert(SUCCEEDED(hr)) /

lstrcpy(szCLSID,wszCLSID)/

CoTaskMemFree(wszCLSID) /

}/

LONG DeleteKey(HKEY hKeyParent, const TCHAR* lpszKeyChild)/

{/

HKEY hKeyChild /

LONG lRes = RegOpenKeyEx(hKeyParent, lpszKeyChild, 0,KEY_ALL_ACCESS, &hKeyChild) /

if (lRes != ERROR_SUCCESS)/

{/

return lRes /

}/

FILETIME time /

TCHAR szBuffer[256] /

DWORD dwSize = 256 /

while (RegEnumKeyEx(hKeyChild, 0, szBuffer, &dwSize, NULL,NULL, NULL, &time) == S_OK)/

{/

lRes = DeleteKey(hKeyChild, szBuffer) /

if (lRes != ERROR_SUCCESS)/

{/

RegCloseKey(hKeyChild) /

return lRes/

}/

dwSize = 256 /

}/

RegCloseKey(hKeyChild) /

return RegDeleteKey(hKeyParent, lpszKeyChild) /

}/

BOOL SetKeyAndValue(const TCHAR* szKey,const TCHAR* szSubkey,const TCHAR* szValue)/

{/

TCHAR szKeyBuf[1024] /

lstrcpy(szKeyBuf, szKey) /

if (szSubkey != NULL)/

{/

lstrcat(szKeyBuf, L"//") /

lstrcat(szKeyBuf, szSubkey ) /

}/

HKEY hKey/

long lResult = RegCreateKeyEx(HKEY_CLASSES_ROOT ,szKeyBuf, 0, NULL, REG_OPTION_NON_VOLATILE,/

KEY_ALL_ACCESS, NULL, &hKey, NULL) /

if (lResult != ERROR_SUCCESS)/

{/

return FALSE /

}/

if (szValue != NULL)/

{/

RegSetValueEx(hKey, NULL, 0, REG_SZ, (BYTE *)szValue, 2*lstrlen(szValue)+1) /

}/

RegCloseKey(hKey) /

return TRUE /

}/

HRESULT

RegisterTypeLibServer(const CLSID&clsid, const TCHAR *szVersion,

const TCHAR *szLibraryName, const TCHAR *szTlbPath) /

{/

TCHAR szCLSID[CLSID_STRING_SIZE] /

CLSIDtoString(clsid, szCLSID, sizeof(szCLSID)) /

TCHAR szKey[MAX_PATH] /

lstrcpy(szKey, L"TypeLib//") /

lstrcat(szKey, szCLSID) /

SetKeyAndValue(szKey, NULL, NULL) /

SetKeyAndValue(szKey, szVersion, szLibraryName) /

lstrcat(szKey, L"//") /

lstrcat(szKey, szVersion) /

SetKeyAndValue(szKey, L"0", NULL) /

TCHAR szSubKey[MAX_PATH] /

memset(szSubKey,0,MAX_PATH)/

lstrcpy(szSubKey,szKey)/

lstrcat(szSubKey, L"//0") /

SetKeyAndValue(szSubKey, L"win32", szTlbPath) /

SetKeyAndValue(szKey, L"FLAGS", L"0") /

TCHAR szTlbDir[MAX_PATH]/

lstrcpy(szTlbDir,szTlbPath)/

PathRemoveFileSpec(szTlbDir)/

SetKeyAndValue(szKey, L"HELPDIR", szTlbDir) /

return S_OK /

}/

HRESULT UnregisterTypeLibServer(const CLSID&clsid)/

{/

TCHAR szCLSID[CLSID_STRING_SIZE] /

CLSIDtoString(clsid, szCLSID, sizeof(szCLSID)) /

TCHAR szKey[64] /

lstrcpy(szKey, L"TypeLib//") /

lstrcat(szKey, szCLSID) /

LONG lResult = DeleteKey(HKEY_CLASSES_ROOT, szKey) /

return lResult==ERROR_SUCCESS?S_OK:E_FAIL /

}/

int g_cTemplates = sizeof(g_Templates)/sizeof(g_Templates[0])/

STDAPI DllRegisterServer()/

{/

TCHAR szTlbDir[MAX_PATH]/

::GetModuleFileName(g_hModule,szTlbDir,MAX_PATH)/

PathRenameExtension(szTlbDir,L".tlb")/

RegisterTypeLibServer(clsid,version,libraryname,szTlbDir)/

return AMovieDllRegisterServer2( TRUE )/

}/

STDAPI DllUnregisterServer()/

{/

UnregisterTypeLibServer(clsid)/

return AMovieDllRegisterServer2( FALSE )/

} /

extern "C" VARIANT_BOOL WINAPI DllEntryPoint(HINSTANCE, ULONG, LPVOID)/

VARIANT_BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call, LPVOID lpReserved )/

{/

g_hModule = hModule/

return DllEntryPoint((HINSTANCE)(hModule), ul_reason_for_call, lpReserved)/

}

#define DECLARE_COM_OBJECT /

DECLARE_IUNKNOWN/

static CUnknown * WINAPI CreateInstance (LPUNKNOWN punk, HRESULT *phr)/

STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void ** ppv)/

#define IMPLEMENT_COM_INSTANCE(c,n,i) /

CUnknown * c::CreateInstance (LPUNKNOWN punk, HRESULT *phr)/

{/

CUnknown*pObj = new c(n,punk)/

*phr = pObj==NULL?E_OUTOFMEMORY:S_OK/

return pObj/

}/

STDMETHODIMP c::NonDelegatingQueryInterface(REFIID riid, void ** ppv)/

{/

if (riid == __uuidof(i)) {/

GetInterface((i*) this, ppv)/

return NOERROR/

}

#define QUERY_INTERFACE(i) /

else if (riid == __uuidof(i)) {/

GetInterface((i*) this, ppv)/

return NOERROR/

}

#define END_COM_OBJECT(p) /

else {/

return p::NonDelegatingQueryInterface(riid,ppv)/

}/

}

1, 怎么在Visual C#.NET中使用COM组件

2, 怎么在ASP.NET中使用MS Rich Text组件

关于第一个问题,让我们通过一个例子看如何在C#中可以方便的使用COM组件。

假设我们需要编写一个简单的windows media player。

第一步,建立项目:在Visual Studio.NET中建立一个新的C# Project,类型是 Windows Application 。项目建立后将出现一个可视化的Form编辑界面。

第二步,导入COM组件:在Project菜单中选择Add Reference。在d出的对话框中选择“COM”标签。第三步,在“COM”标签页的列表框中选择Windows Media Player,对应的文件是[System32]\msdxm.ocx。点击右方“select”按钮,然后点击下方“OK”按钮。此时,在Visual Studio.NET窗体左侧的Toolbox框的Components栏目下将出现”Media Player”选项。

第三步,使用COM组件:在Toolbox框的Components栏目中选择”Media Player”,将其放置到中间的Form上。

第四步,编辑COM组件属性:选中被放置到Form窗体上的Media Player组件,在右侧的Properties框中选择FileName属性,填入需要播放的avi文件的全路径文件名,如c:\mymovies\birthdayparty.avi。

第五步,完成:按F5运行程序。程序运行后即自动开始播放指定的媒体片断。

其他COM组件也可以通过Visual Studio.NET以类似方法使用。

关于第二个问题,不太清楚您所说的“引用了一个MS 的Rich Edit的Com组件”具体是怎么做的。如果您通过<OBJECT>标记把RichEdit组件插入到一个HTML页面中的,那么在服务器端的脚本中是无法访问改组件的。同样的,其他的客户端页面控件如 也均无法在服务器端的脚本(即被包围的程序段)中访问。在ASP.NET中如果需要实现这样的访问,需要给页面控件增加runat=server属性。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11940561.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存