/*-------------------------------------------------------------------------------------------------------*/ /* LabWindows/CVI调用DLL实用例程(菜农HotPower) */ /* 本例程是在CVI自带的simple添加调用mydll.dll的函数MyDLLCdeclFunction() */ /* 网上和CVI的例程很少,一般为调用LIB实例,但很多dll都是以*.dll提供的,故本例程很实用。 */ /* 本例程主要是调用了三个Windows API函数LoadLibrary(),GetProcAddress(),FreeLibrary() */ /* 菜农HotPower@126.com 2008.5.27 于西安大雁塔菜地 */ /*-------------------------------------------------------------------------------------------------------*/
/* This is a simple project that will call * functions from an external DLL */ //#define __cplusplus
#include <stdio.h> #include <windows.h>//需要的API函数实际在winbase.h中定义
#include <cvirte.h> /* Needed if linking in external compiler; harmless otherwise */ #include <formatio.h> #include <userint.h> #include "mydll.h"
/*-------------------------------------------------------------------------------------------------------*/ typedef long int DLLEXPORT (*DLLCdeclFunction)(char *);//定义函数指针 /*-------------------------------------------------------------------------------------------------------*/
int status; char message[80];
int main (int argc, char *argv[]) { /*-------------------------------------------------------------------------------------------------------*/ HMODULE hinstLib; DLLCdeclFunction DLLFunction; BOOL fFreeResult, fRunTimeLinkSuccess = FALSE; /*-------------------------------------------------------------------------------------------------------*/
if (InitCVIRTE (0, argv, 0) == 0) /* Needed if linking in external compiler; harmless otherwise */ return -1; /* out of memory */ /* Tell the dll to run it's user interface */ RunDllUI(); /*-------------------------------------------------------------------------------------------------------*/ // Get a handle to the DLL module. hinstLib = LoadLibrary("mydll.dll");//装载动态链接库mydll.dll // If the handle is valid, try to get the function address. if (hinstLib != NULL)//成功装载动态链接库mydll.dll { DLLFunction = (DLLCdeclFunction)GetProcAddress(hinstLib, (LPCSTR)"MyDLLCdeclFunction");//取函数指针地址
// If the function address is valid, call the function. if (fRunTimeLinkSuccess = (DLLFunction != NULL))//dll中有函数MyDLLCdeclFunction() { Fmt(message, "message via DLL function\n"); status = (long int)DLLFunction (message);//调用dll函数!!! } // Free the DLL module
fFreeResult = FreeLibrary(hinstLib);//卸载动态链接库mydll.dll } // If unable to call the DLL function, use an alternative if (! fRunTimeLinkSuccess) { Fmt(message, "message via alternative method\n"); MessagePopup ("CVI MessagePopup ", message); } /*-------------------------------------------------------------------------------------------------------*/
/* Call the Stdcall Style DLL Function */ status = MyDLLStdcallFunction("Text buffer 1 being passed from CVI to DLL"); /* Display returned value from DLL function */ Fmt(message, "MyDLLStdcallFunction status returned: %i", status); MessagePopup ("CVI MessagePopup ", message);
/* Call the Cdecl Style DLL Function */ status = MyDLLCdeclFunction("Text buffer 2 being passed from CVI to DLL"); /* Display returned value from DLL function */ Fmt(message, "MyDLLCdeclFunction status returned: %i", status); MessagePopup ("CVI MessagePopup ", message);
return 0; }
相关链接:http://space.**/Upload/Blog/2008/5/27/3dd1bb60-01d3-48d6-9967-ecece1a2a758.rar |