我在VB中编制了一个ActiveX DLL,因为VB无法编制标准的DLL,所以想将此ActiveX DLL转化为标准的DLL在其他程序中调用。我的ActiveX DLL很简单,由一个类、一个模块、一个窗体(此为VB中编制)构成,类在初始化时就加载窗体。现在我想将此ActiveX DLL在Delphi中转换成标准的DLL,我想在其他程序中如果通过LoadLibrary一调用此DLL就实现加载窗体,而我对Delphi一窍不通,所以请您帮忙,谢谢!!!
我的代码如下:
//通过转化VB的ActiveX DLL
unit MyTest_TLB;
{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers.
{$WARN SYMBOL_PLATFORM OFF}
{$WRITEABLECONST ON}
{$VARPROPSETTER ON}
interface
uses Windows, ActiveX, Classes, Graphics, OleServer, StdVCL, Variants;
const
MyTestMajorVersion = 6;
MyTestMinorVersion = 0;
LIBID_MyTest: TGUID = '{5EFDB46C-52BF-43C0-8340-D2EC38A7F6A8}';
IID__clsPub: TGUID = '{016A3672-BC1D-41E7-B90A-AEF75635B2FD}';
CLASS_clsPub: TGUID = '{F29EEA66-82CF-4D25-88CE-4CD272CE6A87}';
type
_clsPub = interface;
_clsPubDisp = dispinterface;
clsPub = _clsPub;
_clsPub = interface(IDispatch)
['{016A3672-BC1D-41E7-B90A-AEF75635B2FD}']
end;
_clsPubDisp = dispinterface
['{016A3672-BC1D-41E7-B90A-AEF75635B2FD}']
end;
CoclsPub = class
class function Create: _clsPub;
class function CreateRemote(const MachineName: string): _clsPub;
end;
implementation
uses ComObj;
class function CoclsPub.Create: _clsPub;
begin
Result := CreateComObject(CLASS_clsPub) as _clsPub;
end;
class function CoclsPub.CreateRemote(const MachineName: string): _clsPub;
begin
Result := CreateRemoteComObject(MachineName, CLASS_clsPub) as _clsPub;
end;
end.//DLL
library MyDll;
uses
SysUtils,
Classes,
messages,
windows,
MyTest_TLB in 'C:\Program Files\Borland\Delphi7\Imports\MyTest_TLB.pas';
{$R *.res}
var
TMyTest:MyTest_TLB.CoClsPub;procedure Install;stdcall;
begin
TMyTest.Create;
end;
//exports Install;
//我不想输出函数
procedure DllEntryPoint(fdwReason:DWORD);
begin
case fdwReason of
DLL_PROCESS_ATTACH:Install;
DLL_PROCESS_DETACH:MessageBeep(0);
DLL_THREAD_ATTACH:Install;
DLL_THREAD_DETACH:MessageBeep(0);
end;
end;begin
DLLProc:=@DllEntryPoint;
DllEntryPoint(DLL_PROCESS_ATTACH);
end.
我编译了标准的DLL后重新回到VB的环境中使用,代码如下:
Private Sub Form_Load()
Dim lRes As Long
lRes = LoadLibrary("D:\Dll\MyDll.dll")
If lRes <> 0 Then
MsgBox "运行成功!"
End If
End Sub
但一运行就出现:“Exception EOleSysError in Module MyTest.dll at 00025081.尚未调用CoInitialize.”错误,我不知如何解决。另外:如果生成了标准的DLL,是否还需要原先由VB的ActiveX DLL调用的其他各个类库吗?
我的代码如下:
//通过转化VB的ActiveX DLL
unit MyTest_TLB;
{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers.
{$WARN SYMBOL_PLATFORM OFF}
{$WRITEABLECONST ON}
{$VARPROPSETTER ON}
interface
uses Windows, ActiveX, Classes, Graphics, OleServer, StdVCL, Variants;
const
MyTestMajorVersion = 6;
MyTestMinorVersion = 0;
LIBID_MyTest: TGUID = '{5EFDB46C-52BF-43C0-8340-D2EC38A7F6A8}';
IID__clsPub: TGUID = '{016A3672-BC1D-41E7-B90A-AEF75635B2FD}';
CLASS_clsPub: TGUID = '{F29EEA66-82CF-4D25-88CE-4CD272CE6A87}';
type
_clsPub = interface;
_clsPubDisp = dispinterface;
clsPub = _clsPub;
_clsPub = interface(IDispatch)
['{016A3672-BC1D-41E7-B90A-AEF75635B2FD}']
end;
_clsPubDisp = dispinterface
['{016A3672-BC1D-41E7-B90A-AEF75635B2FD}']
end;
CoclsPub = class
class function Create: _clsPub;
class function CreateRemote(const MachineName: string): _clsPub;
end;
implementation
uses ComObj;
class function CoclsPub.Create: _clsPub;
begin
Result := CreateComObject(CLASS_clsPub) as _clsPub;
end;
class function CoclsPub.CreateRemote(const MachineName: string): _clsPub;
begin
Result := CreateRemoteComObject(MachineName, CLASS_clsPub) as _clsPub;
end;
end.//DLL
library MyDll;
uses
SysUtils,
Classes,
messages,
windows,
MyTest_TLB in 'C:\Program Files\Borland\Delphi7\Imports\MyTest_TLB.pas';
{$R *.res}
var
TMyTest:MyTest_TLB.CoClsPub;procedure Install;stdcall;
begin
TMyTest.Create;
end;
//exports Install;
//我不想输出函数
procedure DllEntryPoint(fdwReason:DWORD);
begin
case fdwReason of
DLL_PROCESS_ATTACH:Install;
DLL_PROCESS_DETACH:MessageBeep(0);
DLL_THREAD_ATTACH:Install;
DLL_THREAD_DETACH:MessageBeep(0);
end;
end;begin
DLLProc:=@DllEntryPoint;
DllEntryPoint(DLL_PROCESS_ATTACH);
end.
我编译了标准的DLL后重新回到VB的环境中使用,代码如下:
Private Sub Form_Load()
Dim lRes As Long
lRes = LoadLibrary("D:\Dll\MyDll.dll")
If lRes <> 0 Then
MsgBox "运行成功!"
End If
End Sub
但一运行就出现:“Exception EOleSysError in Module MyTest.dll at 00025081.尚未调用CoInitialize.”错误,我不知如何解决。另外:如果生成了标准的DLL,是否还需要原先由VB的ActiveX DLL调用的其他各个类库吗?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货