C++ calling a dll.
C++ calling a dll.
Ok lets say we have a function we want to call in C++. We would normally do this:
/* declare the function */
int MyFunction(char*,int);
int main(void)
{
returnMyFunction("hello", 5);
}
/* our function */
int MyFunction(char*,int)
{
/* do something */
return 0;
}
----------------------------------------------------------------------------------
But in our case that same function is in a dll. Ok let's see how we do it.
Your dll is located on the C:\ drive for example and is named "MyDLL.dll". It
contains a function called "MyFunction". Create a function that calls the dll's function like so:
int CallMyDLL(void)
{
/* get handle to dll */
HINSTANCE hGetProcIDDLL = LoadLibrary("C:\\MyDLL.dll");
/* get pointer to the function in the dll*/
FARPROC lpfnGetProcessID = GetProcAddress(HMODULE (hGetProcIDDLL),"MyFunction");
/*
Define the Function in the DLL for reuse. This is just prototyping the dll's function.
A mock of it. Use "stdcall" for maximum compatibility.
*/
typedef int (__stdcall * pICFUNC)(char *, int);
pICFUNC MyFunction;
MyFunction = pICFUNC(lpfnGetProcessID);
/* The actual call to the function contained in the dll */
int intMyReturnVal = MyFunction("hello", 5);
/* Release the Dll */
FreeLibrary(hGetProcIDDLL);
/* The return val from the dll */
returnintMyReturnVal;
}
You can just copy and paste the above into your project and change the prototyping to match your dll's function.
http://www.daniweb.com/software-development/cpp/threads/177816/c-calling-a-dll
Hi i have a requirement where a cpp file should load a dll viz gzip.dll.then the cpp should call few methods in the dll.well im able to call the methods with no parameters but im unable to call the methods with parameters.if im trying to call methods with parameters i am getting memory exception in runtime.the program compiles very fine.i actually replicated the code in vb where a similair call has been made to the methods in gzip.dll for compression and decompression.but in cpp it doesnt work for calling these methods with the exact parameters.may be my code has a flaw.
Please c the file.u can find the gzip.dll from C:\WINNT\system32\gzip.dll
#include<windows.h>
#include<stdio.h>
int main()
{
HINSTANCE hGetProcIDDLL =LoadLibrary("C:\\WINNT\\system32\\gzip.dll");
printf("dll loaded");
/* get pointer to the function in the dll*/
FARPROC lpfnGetProcessID =GetProcAddress(HMODULE (hGetProcIDDLL),"Decompress");
FARPROC lpfnGetProcessID1 =GetProcAddress(HMODULE (hGetProcIDDLL),"InitDecompression");
FARPROC lpfnGetProcessID2 =GetProcAddress(HMODULE (hGetProcIDDLL),"CreateDecompression");
FARPROC lpfnGetProcessID3 =GetProcAddress(HMODULE (hGetProcIDDLL),"InitCompression");
FARPROC lpfnGetProcessID4 =GetProcAddress(HMODULE (hGetProcIDDLL),"CopyMemory");
// Call CopyMemory(arrDestination(destbeginPos), arrSource(srcbeginPos), length)
// printf("Hello World long decompress!\n");
//printf(1);
typedeflong(__stdcall * pICFUNC)(long, BYTE[],long,BYTE[],long,long,long);
typedeflong(__stdcall * pICFUNC1)();
typedeflong(__stdcall * pICFUNC2)(long,int);
typedeflong(__stdcall * pICFUNC3)();
typedeflong(__stdcall * pICFUNC4)(BYTE[],BYTE[],long);
typedef UINT (CALLBACK*CopyMemory)(BYTE[],BYTE[],long);
CopyMemory ptrCopyMemory;
ptrCopyMemory =(CopyMemory)GetProcAddress(hGetProcIDDLL,"CopyMemory");
typedef UINT (CALLBACK*InitDecompression)();
InitDecompression ptrInitDecompression;
ptrInitDecompression =(InitDecompression)GetProcAddress(hGetProcIDDLL,"InitDecompression");
//ReturnVal = ptrLockWorkStation();
ptrInitDecompression();
printf("Hello World long decompress!\n");
pICFUNC MyFunction;
MyFunction= pICFUNC(lpfnGetProcessID);
pICFUNC1 MyFunction1;
MyFunction1= pICFUNC1(lpfnGetProcessID1);
pICFUNC2 MyFunction2;
MyFunction2= pICFUNC2(lpfnGetProcessID2);
pICFUNC3 MyFunction3;
MyFunction3= pICFUNC3(lpfnGetProcessID3);
pICFUNC4 MyFunction4;
MyFunction4= pICFUNC4(lpfnGetProcessID4);
//BYTE[] a=NewByteArray(jb);
unsignedlong handle=0;long max=1024;long inu=0;long outu=0;int GZIP_LVL=1;
BYTE *AB={(unsignedchar*)"1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"};
// int li= strlen( (char*)AB);
int orglen=100;
//printf("%l", li);
BYTE *oB=new BYTE[43822];
CopyMemory(AB,oB,234);
printf("function defined and parameters ready"+orglen,"%l",orglen);
printf("function defined and parameters ready");
/* The actual call to the function contained in the dll */
handle=MyFunction1();
//handle=MyFunction4(AB,oB,inu);
handle=MyFunction3();
printf("InitDecompression & InitCompression");
MyFunction2(handle,GZIP_LVL);//Call CreateDecompression(handle, GZIP_LVL);
//handle=MyFunction2(handle,GZIP_LVL);
printf("CreateDecompression");
longintMyReturnVal=0;
do
{// int
intMyReturnVal=MyFunction(handle, AB, orglen, oB, max, inu, outu);
orglen = orglen - inu;
}
while(intMyReturnVal=0);
/* Release the Dll */
FreeLibrary(hGetProcIDDLL);
printf("Hello World long decompress!\n");
/* The return val from the dll */
returnintMyReturnVal;
}
Best Regards To Reader:
==============================================
Royal Kao(高全宁)
Mob: 13771921045
Mail: gaoquanning@163.com
Blog: http://www.cnblogs.com/gaoquanning/
==============================================