Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows Delphi中COM支持的DLL和.EXE之间的切换_Windows_Delphi_Winapi_Dll_Portable Executable - Fatal编程技术网

Windows Delphi中COM支持的DLL和.EXE之间的切换

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项目完成了所有这些

我有以下情况:

我有一个delphi应用程序
{$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并继续使用