Procedure TFrmMain.Cmd_ByNameClick(Sender: TObject);
Begin
If @MsgBox <> Nil Then
MsgBox('这是按名称调用的函数', '提示');
End;
Procedure TFrmMain.CmdByIndexClick(Sender: TObject);
Begin
If @MsgBoxEx <> Nil Then
MsgBoxEx('这是按序号调用的函数', '提示', MB_ICONINFORMATION Or MB_OKCANCEL);
End;
Procedure TFrmMain.SetControls(B: Boolean);
Begin
Cmd_Load.Enabled := Not B;
Cmd_Free.Enabled := B;
End;
Procedure TFrmMain.Cmd_LoadClick(Sender: TObject);
Var
FileName: String;
Mem: TMemoryStream;
FileArray: Array Of Byte;
Begin
SetControls(true);
FileName := ExtractFilePath(ParamStr(0)) + 'MyDll.Dll';
Case CBLoadType.ItemIndex Of
0: //内存
Begin
Mem := TMemoryStream.Create;
Mem.LoadFromFile(FileName);
DllHandle := _LoadLibraryMem(Mem.Memory);
Mem.Free;
End;
1: //数组
Begin
Mem := TMemoryStream.Create;
Mem.LoadFromFile(FileName);
SetLength(FileArray, Mem.Size);
Mem.ReadBuffer(FileArray[0], Mem.Size);
DllHandle := _LoadLibraryMem(FileArray);
Mem.Free;
End;
2: DllHandle := _LoadLibraryFromResourceA(HInstance, 'MyDLL', 'DLL'); //资源
3: DllHandle := _LoadLibraryA(PChar(FileName)); //文件
End;
If DllHandle <> 0 Then
Begin
@MsgBox := _GetProcAddress(DllHandle, 'MsgBox');
@MsgBoxEx := _GetProcAddress(DllHandle, MakeIntResource($1));
End Else SetControls(false);
End;
Procedure TFrmMain.CmdTestClick(Sender: TObject);
Var
ActiveXDllHandle: THandle;
DllGetClassObject: Function(Const CLSID, IID: TGUID; Var Obj): HResult; Stdcall;
vClassFactory: IClassFactory;
v: IMSComm;
Begin
// ConvFileToArray('C:\Windows\System32\MSComm32.OCX', 'MSComm32');
ActiveXDllHandle := _LoadLibraryMem(@MSComm32);
@DllGetClassObject := _GetProcAddress(ActiveXDllHandle, 'DllGetClassObject');
If @DllGetClassObject <> Nil Then
Begin
DllGetClassObject(CLASS_MSComm, IClassFactory, vClassFactory);
If Assigned(vClassFactory) Then
Begin
vClassFactory.CreateInstance(Nil, IMSComm, v);
If Assigned(v) Then
Begin
v.AboutBox;
v := Nil;
End;
vClassFactory := Nil;
End;
_FreeLibrary(ActiveXDllHandle);
End;