我想实现一个MSSCCI提供程序,但是如果可能的话我想在.Net中实现它(所以我的MSSCCI提供程序实际上是一个围绕.Net实现的瘦包装器)
我知道在.Net中实现它意味着任何使用我的MSSCCI提供者的人都将被迫在他们的进程中托管.Net框架 - 这是一个不合理的请求吗?如果我在.Net中实现它还需要考虑其他限制吗?
这是可能的,而且相对容易.我前段时间开发了它并且工作正常.我使用了从C++到C#的 COM互操作性.
所以,你将创建两个dll.在C++之一是仅实现API传递呼叫到一个包装COM在C# .必须使用regasm/codebase mycomlibrary.dll 将C#one注册为COM组件
以下是一些实施它的指南.在代码示例中,我仅将该SccInitialize函数实现为示例.希望能帮助到你.
这是C++组件:
#include <comutil.h>
/**********************************************************************************************************/
// Imports the COM object that implements the SCC API in .NET
/**********************************************************************************************************/
#import "SccCOMServer.tlb" no_namespace named_guids
static int s_nInitializedCount = 0;
/**********************************************************************************************************/
// Starting point of the dll
/**********************************************************************************************************/
BOOL APIENTRY DllMain(
HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
/**********************************************************************************************************/
// Variable with a instance of the COM object
/**********************************************************************************************************/
ISccCOMServer *mCpi = NULL;
/**********************************************************************************************************/
// Utility functions
/**********************************************************************************************************/
void BSTR2T(BSTR s1, LPSTR s2)
{
_bstr_t s(s1, false);
strcpy(s2, s);
}
char* ConvertBSTRToLPSTR (BSTR bstrIn)
{
LPSTR pszOut = NULL;
if (bstrIn != NULL)
{
int nInputStrLen = SysStringLen (bstrIn);
// Double NULL Termination
int nOutputStrLen = WideCharToMultiByte(CP_ACP, 0, bstrIn, nInputStrLen, NULL, 0, 0, 0) + 2;
pszOut = new char [nOutputStrLen];
if (pszOut)
{
memset (pszOut, 0x00, sizeof (char)*nOutputStrLen);
WideCharToMultiByte (CP_ACP, 0, bstrIn, nInputStrLen, pszOut, nOutputStrLen, 0, 0);
}
}
return pszOut;
}
/**********************************************************************************************************/
// IMPLEMENTATION OF THE FUNCTIONS
/**********************************************************************************************************/
/**********************************************************************************************************/
// Initialization and Housekeepeng Functions
/**********************************************************************************************************/
SCCEXTERNC SCCRTN EXTFUN __cdecl SccInitialize(
LPVOID * ppContext,
HWND hWnd,
LPCSTR lpCallerName,
LPSTR lpSccName, // [In, out]
LPLONG lpSccCaps, // [Out]
LPSTR lpAuxPathLabel, // [In, out]
LPLONG pnCheckoutCommentLen, // [Out]
LPLONG pnCommentLen //[Out]
)
{
// Initialize COM the first time the function is called
CoInitialize(0);
s_nInitializedCount++;
HRESULT hr = CoCreateInstance(CLSID_ISccCOMServerImpl,
NULL, CLSCTX_INPROC_SERVER,
IID_ISccCOMServer, reinterpret_cast<void**>(&mCpi));
long response;
// We need auxiliar strings because out string in COM are BSTR *
BSTR bstrSccName;
BSTR bstrAuxPathLabel;
bstrSccName = T2BSTR(lpSccName);
bstrAuxPathLabel = T2BSTR(lpAuxPathLabel);
Context *CC = new Context;
// Calling to the COM equivalent Function
response = mCpi->Initialize(CC, (long) hWnd, lpCallerName, &bstrSccName, lpSccCaps, &bstrAuxPathLabel,
pnCheckoutCommentLen, pnCommentLen);
*ppContext = (void *)CC;
// Converting the strings
BSTR2T(bstrSccName, lpSccName);
BSTR2T(bstrAuxPathLabel, lpAuxPathLabel);
return response;
}
Run Code Online (Sandbox Code Playgroud)
然后C#部分更简单:
[Guid("C6659361-1625-4746-931C-36014B146679")]
public class ISccCOMServerImpl : ISccCOMServer
{
public int Initialize(
out Context ppContext,
IntPtr hWnd,
string lpCallerName,
ref string lpSccName, // out
out int lpSccCaps, // out
ref string lpAuxPathLabel, // out
out int pnCheckoutCommentLen, // out
out int pnCommentLen //out
)
{
//your manage code here!
}
Run Code Online (Sandbox Code Playgroud)
}
| 归档时间: |
|
| 查看次数: |
499 次 |
| 最近记录: |