|
发表于 2004-2-25 08:22:00
|
显示全部楼层
Re:用VC编制DLL程序的方法小结(转帖1)
void test1()
{
typedef int (*funaddint)(int a,int b);
typedef int (*funsubint)(int a,int b);
struct funcvec
{
funaddint fadd;
funsubint fsub;
};
typedef void (*CreateInstanceProc)(funcvec *fvec);
funcvec fx;
HINSTANCE hinstLib=LoadLibrary("dllmath.dll");
CreateInstanceProc Myproc=(CreateInstanceProc)GetProcAddress(hinstLib,"CreateInstance");
Myproc(&fx);
std::cout<<fx.fadd(1,2)<<std::endl;
std::cout<<fx.fsub(3,1)<<std::endl;
FreeLibrary(hinstLib);
}
void test2()
{
class IFunc
{
public:
virtual int add(int a,int b)=0;
virtual int sub(int a,int b)=0;
};
HINSTANCE hinstLib=LoadLibrary("dllmath.dll");
typedef void (*CreateInstanceProc)(IFunc **ppIFunc);
CreateInstanceProc Myproc=(CreateInstanceProc)GetProcAddress(hinstLib,"CreateIFunc");
IFunc *pFunc=NULL;
Myproc(&pFunc);
std::cout<<pFunc->add(1,2)<<std::endl;
std::cout<<pFunc->sub(3,1)<<std::endl;
FreeLibrary(hinstLib);
}
void test3()
{
CoInitialize(NULL);
IDispatch *pDispatch;
CLSID clsid;
::CLSIDFromProgID(OLESTR("atlmath.Atlsmath"),&clsid);
::CoCreateInstance(clsid,NULL,CLSCTX_SERVER,IID_IDispatch,(void**)&pDispatch);
DISPID dispid;
OLECHAR *szName=OLESTR("addint");
pDispatch->GetIDsOfNames(IID_NULL,&szName,1,::GetUserDefaultLCID(),&dispid);
VARIANTARG args[3];
VariantInit(&args[0]);
args[0].vt=VT_I4;
args[0].iVal=12;
VariantInit(&args[1]);
args[1].vt=VT_I4;
args[1].iVal=2;
VariantInit(&args[2]);
long outret=0;
args[2].vt=VT_BYREF|VT_I4;
args[2].plVal=&outret;
VARIANT result;
VariantInit(&result);
DISPPARAMS params;
params.cArgs=3;
params.rgdispidNamedArgs=&dispid;
params.rgvarg=args;
params.cNamedArgs=0;
pDispatch->Invoke(dispid,IID_NULL,GetUserDefaultLCID(),DISPATCH_METHOD,&params,&result,NULL,NULL);
std::cout<<outret<<std::endl;
VariantClear(&args[0]);
VariantClear(&args[1]);
VariantClear(&args[2]);
VariantClear(&result);
CoUninitialize();
} |
|