Introduction
I will give an example of how to create a C DLL function and call it from VB.NET. It is simple but there are some tasks that you have to do.
First, create a C DLL Project. Use VC++ 6, from the File new project wizard, choose Win32 Dynamic-Link Library, click OK. Select an Empty DLL Project, because we just want to create a simple DLL. Click next.
Now add some files. From File new, select Files tab, select C++ Source File, name it for example Simple.c. Repeat the last step by creating Simple.def file.
Double click Simple.c and add the following code:
#include <WINDOWS.H>
LPCSTR DisplayStringByVal(LPCSTR pszString)
{
return "Hallo apa kabar ";
}
void ReturnInParam(int* pnStan, char** pMsg)
{
long *buffer;
char text[] = "Hallo ";
char name[sizeof(*pMsg)];
strcpy(name, *pMsg);
*pnStan = *pnStan + 5;
buffer = (long *)calloc(sizeof(text)+sizeof(*pMsg), sizeof( char ) );
*pMsg = (char *)buffer;
strcpy(*pMsg, text);
strcat(*pMsg, name);
}
The first function simply returns the string "Hallo apa kabar" without processing anything. The second function adds "Hello" in front of the pMsg parameter and adds the pnStan parameter with 5. For example, if you call the second function from VB.NET code as below:
<DllImport("E:\Temp\simple.dll", CallingConvention:="CallingConvention.Cdecl)"> _
Private Shared Sub ReturnInParam(ByRef Stan As Integer, _
ByRef Message As String)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Dim Num As Integer = 8
Dim Message As String = "Harun"
ReturnInParam(Num, Message)
MessageBox.Show(Message)
End Sub
After you call the function, the Num variable value is 13, and the message box will prompt Hello Harun.
Here is an explanation of some important things in the code. Let's see the function declaration in C:
void ReturnInParam(int* pnStan, char** pMsg)
The code...
int* pnStan
... indicates that you want to pass the parameter by reference, not by value. You can see this in the VB code:
Private Shared Sub ReturnInParam(ByRef Stan As Integer, _ ...
The code...
char** pMsg
... also indicates the same thing. The reason I put two asterisks (*) here is because .NET translates char* with a single quote as string and passes the parameter by value. So, if I want to pass the string by reference (or as a pointer), then I have to put another asterisk.
The rest of the C code is about adding 5 to pnStan and "Hello" at the beginning of pMsg. You must know C to understand the code.
Before you compile the C file, there is a final step that needs to be done:
Define the library and function in the Simple.def file as follows:
LIBRARY Simple
DESCRIPTION
EXPORTS
DisplayStringByVal
ReturnInParam
This tells VB where to locate the function Entry Point. If you don't provide this declaration, then you will get a message just like this:
An unhandled exception of type 'System.EntryPointNotFoundException'
occurred in Call_C_dll.exe
Additional information: Unable to find an entry point named ReturnInParam
in DLL E:\Temp\simple.dll.
Well, that's all, simple isn't it?
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.