|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Announcements
Want a new Job?
Chapters
Services
Feature Zones
|
IntroductionI 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;
// do not free the buffer, because it will be used by the caller
// free( buffer );
strcpy(*pMsg, text);
strcat(*pMsg, name);
}
The first function simply returns the <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 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 ( The rest of the C code is about adding Before you compile the C file, there is a final step that needs to be done: LIBRARY Simple
DESCRIPTION 'Sample C DLL for use with .NET'
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?
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||