WEB开发网
开发学院软件开发VC 接触VC之四:COM组件模型基础 阅读

接触VC之四:COM组件模型基础

 2006-07-19 11:36:48 来源:WEB开发网   
核心提示: 当加载成功后,我们会得到一个HMODULE句柄,接触VC之四:COM组件模型基础(4),这个句柄的使用与HINSTANCE应用程序实例的句柄很相似(追查定义,HMODULE就是HINSTANCE),所以我一般会换一种写法,#define DefMathProc(name) int (*na

当加载成功后,我们会得到一个HMODULE句柄。这个句柄的使用与HINSTANCE应用程序实例的句柄很相似(追查定义,HMODULE就是HINSTANCE)。我们可以使用下面一些API函数来使用HMODULE句柄:

LoadBitmap、LoadIcon、LoadString、…、GetProcAddress等等

其中,最重要的就是GetProcAddress。它是用来返回链接库中的某个函数的函数指针,然后我们就可以通过这个函数指针来调用这个链接库函数了。(如果你对函数指针不熟的话,最好再看一看C\C++语法书。我觉得函数指针的声明方法很怪异)其原型如下:

FARPROC GetProcAddress(
 HMODULE hModule,  // handle to DLL module
 LPCSTR lpProcName  // function name
);

啊,hModule我就不说了。lpProcName参数是一个字符串,这个字符串写着我们要找的函数的函数名。如果找到了的话,就返回这个函数的指针,否则返回NULL。

举个例子:

比如说有个链接库函数是”int Plus(int nAugend, int nAddend)”,我要调用它。

HMODULE hMathLib = LoadLibrary("Math.dll");
int (*MyProc)(int, int) = NULL;
int x = 1, y = 1;
MyProc = (int(*)(int, int)) GetProcAddress(hMathLib, "Plus");
If (MyProc != NULL)
{
  printf ("%d", (*MyProc)(x, y));
}
FreeLibrary(hMathLib);

如果我以及这个链接库没有问题的话,我想输出结果应该是2。

我仍然认为函数指针的声明很怪异,可读性并不高,所以我一般会换一种写法。

#define DefMathProc(name) int (*name)(int, int)
#define FUNCTION(name) (*name)
DefMathProc(MyProc) = NULL;
MyProc = (DefMathProc()) GetProcAddress(hMathLib, "Plus");
nResult = FUNCTION(MyProc)(x, y);

虽然会出一个警告,但我觉得这样会舒服一些。

上一页  1 2 3 4 5 6 7 8 9  下一页

Tags:接触 VC COM

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接