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?