Windows Delphi中COM支持的DLL和.EXE之间的切换
我有以下情况: 我有一个delphi应用程序Windows Delphi中COM支持的DLL和.EXE之间的切换,windows,delphi,winapi,dll,portable-executable,Windows,Delphi,Winapi,Dll,Portable Executable,我有以下情况: 我有一个delphi应用程序{$apptypegui}。(APP1) 如果APP1启动,它将在 开始和结束。,就像它应该的那样 稍后,APP1将被转换为DLL(另一个应用程序将这样做-APP2) APP2向APP1的NTFileHeader中的特征添加IMAGE\u FILE\u DLL标志。 然后APP2尝试使用LoadLibrary(或加载DLL的其他COM命令)加载DLL(APP1),但返回错误: Windows在初始化COM时遇到内部错误 图书馆 我用C项目完成了所有这些
{$apptypegui}
。(APP1
)
如果APP1
启动,它将在
开始
和结束。
,就像它应该的那样
稍后,APP1
将被转换为DLL(另一个应用程序将这样做-APP2
)
APP2
向APP1
的NTFileHeader
中的特征添加IMAGE\u FILE\u DLL
标志。
然后APP2
尝试使用LoadLibrary
(或加载DLL的其他COM命令)加载DLL(APP1
),但返回错误:
Windows在初始化COM时遇到内部错误
图书馆
我用C
项目完成了所有这些,并使用了WinMain
函数。但是,它在Delphi中似乎不起作用(APP1
不是作为DLL启动的)。如何将APP1
转换为工作DLL
编辑:
我正在尝试将此代码从C
移植到Delphi:
我已经正确地移植了它,并且一切正常,但是CRYPTBASE.dll
(APP1
)没有启动。(见上面的错误)
简言之:
创建一个delphi应用程序,在文件头中添加IMAGE\u FILE\u DLL
特征。将其重命名为CRYPTBASE.dll
,并将其复制到C:\Windows\System32\sysprep。然后启动sysprep.exe
这里的信息:根据惯例,只是一个名称,用作可执行文件的入口点。DLL的约定是使用名称。Windows加载程序不搜索WinMain,LoadLibrary不搜索DllMain,它只调用pe头中的入口点
Delphi也不使用,入口点的导出名称是start
WinMain签名不同于DllMain(WinMain需要四个参数),我的建议是声明函数DllMain并在exe中导出它:
function DllMain(hinstDLL: THandle; fdwReason: DWORD; lpvReserverd: Pointer): BOOL; stdcall;
begin
// do something
end;
exports
DllMain;
将exe(我认为在mem中)修改为dll的代码应该将入口点设置为DllMain(通过遍历EAT获取其地址)
另外:确保重定基址时,重定基址表没有按照DLL的要求剥离(在发布模式下)。根据惯例,只是一个名称,用作可执行文件的入口点。DLL的约定是使用名称。Windows加载程序不搜索WinMain,LoadLibrary不搜索DllMain,它只调用pe头中的入口点
Delphi也不使用,入口点的导出名称是start
WinMain签名不同于DllMain(WinMain需要四个参数),我的建议是声明函数DllMain并在exe中导出它:
function DllMain(hinstDLL: THandle; fdwReason: DWORD; lpvReserverd: Pointer): BOOL; stdcall;
begin
// do something
end;
exports
DllMain;
将exe(我认为在mem中)修改为dll的代码应该将入口点设置为DllMain(通过遍历EAT获取其地址)
另外:确保重定基址时,重定基址表没有按照DLL的要求剥离(在发布模式下)。我认为您根本不应该这样做。在构建EXE和DLL时,代码是按照不同的假设编译的,如果您只是简单地翻转标志并更改扩展名,代码将不起作用 尝试这样的东西是一个很好的实验和学习方法,但这对生产来说是个坏主意 告诉我们你想要实现什么,用比“以EXE方式运行我的DLL”更具体的术语来说。为什么需要将DLL作为EXE运行
例如,您可以构建DLL,然后使用rundll32加载并调用它。如果COM需要此功能,则可以构建COM主机exe并依靠COM的自动编组来实现“好像我的代码在同一进程中”的效果。这一切都已经在COM中出现了。我认为你根本不应该这样做。在构建EXE和DLL时,代码是按照不同的假设编译的,如果您只是简单地翻转标志并更改扩展名,代码将不起作用 尝试这样的东西是一个很好的实验和学习方法,但这对生产来说是个坏主意 告诉我们你想要实现什么,用比“以EXE方式运行我的DLL”更具体的术语来说。为什么需要将DLL作为EXE运行
例如,您可以构建DLL,然后使用rundll32加载并调用它。如果COM需要此功能,则可以构建COM主机exe并依靠COM的自动编组来实现“好像我的代码在同一进程中”的效果。这些都已经出现在COM中。我想您需要在这里详细说明。我完全不知道你的意思。有什么原因不能导出不同的函数名吗?导入的
WinMain
可能与主机应用程序的WinMain
冲突……我完全不理解这一点。我真的不明白这些代码想做什么。为什么要告诉我们您的应用程序是$Apptype GUI?默认情况下,这是任何delphi VCL表单应用程序,您不必在任何地方声明它。有两种类型,控制台和gui,您创建了哪一种?我想他希望有一个可执行文件,将其自身注入另一个可执行文件“作为dll”,我想您需要在这里详细说明。我完全不知道你的意思。有什么原因不能导出不同的函数名吗?导入的WinMain
可能与主机应用程序的WinMain
冲突……我完全不理解这一点。我真的不明白这些代码想做什么。为什么要告诉我们您的应用程序是$Apptype GUI?默认情况下,这是任何delphi VCL表单应用程序,您不必在任何地方声明它。有两种类型,控制台和gui,你创建了哪一种?我想他希望有一个可执行文件,将自身注入另一个可执行文件“作为dll”,那么,是否有可能将delphi项目编译为dll并继续使用