0
20/05/2008
1
... "
."
.(17)
2
3 .............................................................................................................. .1
3 ................................................................................ .2
3 .......................................................................................................... . 1 .2
5 ....................................................................................... .2 .2
5 .................................................................................... .2
8 .................................................................................................... .3
9 . ................................................................ ++ / .1 .3
10 ........................................................................ .2 .3
12 ........................................................................... .3 .3
13 ............................................................................................................. .4
3
.1
.
.
.
.
.2
,
.
.1 .2
.
ildasm1
Microsoft Visual Studio 8\ SDK\v2.0\ Bin\ ildasm.exe .
.
.IL Disassembler :1
1
ILDasm: Intermediate Language Disassembler
4
. .1
( ) .1
,Ctrl+ M
.il File\ Dump
.[ 5]
More Information
Field
Static Field
Class
Namespace
Method
Static Method
Property
Interface
Structure
Event
.[5] :1
ilasm
.
executable machine code
(MSIL2 IL)
. MSIL
. obfuscator
(IL)
ILDasm Reflector
.
++
.(Registration)
2
.MSIL: Microsoft Intermediate Language
5
.2.2
:
.
." "
. ++
++ .
.
.
.
.
. MFC
++
.
.2
++
,
.
2
.Smart Device
6
:2
DLL3
Win32 Win32 Project
.ATL MFC
:
#include "stdafx.h"
#ifdef _MANAGED
#pragma managed(push, off)
#endif
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call,
LPVOID lpReserved )
{ return TRUE;}
#ifdef _MANAGED
#pragma managed(pop)
#endif
Debug
. " "
. Debug Build
. FirstMethod
. int int .
extern "C" __declspec(dllexport) int _stdcall FirstMethod()
{ int output=7;
return output;
}
3
.DLL: Dynamic Library Link
7
++
. ++
#include "stdafx.h"
#include "stdio.h"
#ifdef __cplusplus // used in C++,
extern "C" { //export the C interface
#endif
#ifdef _MANAGED
#pragma managed(push, off)
#endif
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID
lpReserved )
{ return TRUE; }
#ifdef _MANAGED
#pragma managed(pop)
#endif
__declspec(dllexport) int __cdecl FirstMethod()
{ printf("this is an output of the API FirstMethod. \n");
int output=7;
return output;
}
#ifdef __cplusplus
}
#endif
. " "
FirstMethod debugMethod
:
#endif
void debugMethod()
{ printf("this is an output of the API FirstMethod. \n");
}
__declspec(dllexport) int __cdecl FirstMethod()
{ debugMethod();
return 7;
}
.
.h .lib
.(Third Party)
8
.
.lib
.h .Configuration Properties\ Linker\ General\ Additional Library Directories
.Configuration Properties\ C/ C++\ Additional Include Directories
Configuration Properties\ Linker\ Input\ Additional Dependencies
:
#pragma comment(lib,"Iphlpapi.lib")
#pragma comment(lib,"ws2.lib")
.
ATL CString .
MFC
atlstr.h atlsd.lib Win32
: atlstr.h
#include "stdafx.h"
#include <atlstr.h>
#include <conio.h>
void _tmain(int argc, _TCHAR* argv[])
{ CString Item("This is a trial.");
Item=Item.Mid(0,8); // Return only the first 8 Chars
printf("%S",Item.GetString());
getch();
}
.3
.
;
.
9
++ / .1.3
// testarabteam2000.cpp : Defines the entry point for the console
application.
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
typedef int (__cdecl *MYPROC)(LPWSTR);
void _tmain(int argc, _TCHAR* argv[])
{
HINSTANCE Instance_To_Load_Lib;
MYPROC PROC_To_Load_Method;
BOOL bRet_free_Lib, bRet_To_Load_Method = FALSE;
// Load DLL
Instance_To_Load_Lib = LoadLibrary(TEXT("testDLL"));
// Get function Address if Load DLL succeded
if (Instance_To_Load_Lib != NULL)
{ PROC_To_Load_Method = (MYPROC) GetProcAddress(Instance_To_Load_Lib,
"FirstMethod");
// If the function address is valid, call the function.
//call the target method if Address is valid
if (NULL != PROC_To_Load_Method)
{ bRet_To_Load_Method = TRUE;
(PROC_To_Load_Method) (L"DLL function found\n");
}
//Free the loaded DLL.
bRet_free_Lib = FreeLibrary(Instance_To_Load_Lib);
}
// Failed to load the DLL.
if (! bRet_To_Load_Method)
printf("Library not found.\n Please check the existance of the target dll
in c:\\windows\\system32.\n");
system("PAUSE");
}
.System32
[ 4]
: SetDllDirectory
Instance_To_Load_Lib = LoadLibrary(TEXT("c:\\testDLL"));
System32
,
10
:
$(OutDir)\$(ProjectName).dll
.Configuration Properties\ Linker\ General\ Output File
$(OutDir) .$(ProjectName)
Debug . Debug
.lib .
. .manifest
.C:\ Windows\ System32\ $(ProjectName).dll $(OutDir)\ $(ProjectName).dll
.2.3
[ 3] DllImport
System.Runtime.InteropServices
.FirstMethod testDLL.dll
[System.Runtime.InteropServices.DllImport("testDLL.dll")]
public static extern int FirstMethod();
private void MainForm_Load(object sender, EventArgs e)
{ MessageBox.Show(
String.Format(
"The output of the API FirstMethod() is equal to {0}.",
FirstMethod()));
}
extern
.VB.Net Shared
.3
11
. 3:
.
.
CString
: debugMethod
__declspec(dllexport) BSTR __cdecl debugMethod(int ErrorCode)
{ CString ErrorMsg("Undefined error");
switch(ErrorCode)
{ case 1: ErrorMsg=_T("File not found."); break;
case 2: ErrorMsg=_T("File in use."); break;
case 3: ErrorMsg=_T("Storage memory is critically low."); break;
}
return ErrorMsg.AllocSysString();
}
, /
:
' 1
Imports System.Runtime.InteropServices
Public Class Form1
' 2
<DllImport("testDLL.dll", EntryPoint:="debugMethod")> _
Public Shared Function OurSecondMethod(ByVal ErrorNbr As Integer) As IntPtr
End Function
<DllImport("testDLL.dll")> _
Public Shared Function FirstMethod(ByVal ErrorNbr As Integer) As Integer
End Function
Private Sub btn_show_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles btn_show.Click
' 3
Dim ErrorCode As Integer = Int32.Parse(txb_ErrorCode.Text)
Dim ptrErrorText As IntPtr = OurSecondMethod(ErrorCode)
Dim strErrorText As String = Marshal.PtrToStringBSTR(ptrErrorText)
Marshal.FreeBSTR(ptrErrorText)
lbl_ErrorText.Text = strErrorText
End Sub
Private Sub btn_Exit_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles btn_Exit.Click
Application.Exit()
End Sub
End Class
12
VB.Net
.( 2 ) EntryPoint DllImport
. debugMethod
.
DllImport
PtrToStringBSTR .Marshal
BSTR debugMethod
:
:3
.3.3
++
.
.JNI4
#include <jni.h>
. java/ lang/ RuntimeException
void ThrowException(JNIEnv * env, char * strErr)
{
jclass newExcCls;
newExcCls = env->FindClass("java/lang/RuntimeException");
if (newExcCls == NULL)
return;
env->ThrowNew(newExcCls, strErr);
}
4
JNI: Java Native Interface
13
JNI
: . ++
JNIEXPORT jstring JNICALL debugMethod(JNIEnv * env, int ErrorCode)
{ jstring strRet = NULL;
char ErrorMsg[30];
switch(ErrorCode)
{ case 1: sprintf(ErrorMsg,"File not found."); break;
case 2: sprintf(ErrorMsg,"File in use."); break;
case 3: sprintf(ErrorMsg,"Storage memory is critically low."); break;
default: ThrowException(env, "Undefined Exception"); break;
}
strRet = env->NewStringUTF((const char *) ErrorMsg);
return strRet;
}
LoadLibrary
System
.VB.NET shared extern native
public class PInvokeClass
{
static public native String debugMethod(int ErrorCode)throws RuntimeException;
static public native int FirstMethod()throws RuntimeException;
static {
System.loadLibrary("testDLL");
}
}
.4
.
... [6] MFC ++ /
14
http://msdn.microsoft.com/en-us/library/ms683152(VS.85).aspx [1 ]
http://msdn.microsoft.com/en-us/library/ms684175(VS.85).aspx [2 ]
http://msdn.microsoft.com/en-
u s /library/system.runtime.interopservices.dllimportattribute.aspx [3 ]
http://msdn.microsoft.com/en-us/library/ms686203(VS.85).aspx [4 ]
. 2003 102 ASP.NET [5 ]
Extending MFC Applications with the .NET Framework [6 ]
15
Daly. Hammadi@ laposte. net