从32位DLL访问64位DLL

5

我正在将CEF4Delfi库移植到Borland C++Builder 5。我从移植的CEF4Delfi源代码中制作了一个BPL包,并从我的C++Builder 5代码中引用它。

我使用的是Windows 10 64位操作系统。

在移植过程中,我遇到了导入DLL函数的问题。

以下是部分导入的内容:

const
  Kernel32DLL = 'kernel32.dll';
  SHLWAPIDLL  = 'shlwapi.dll';
  NTDLL       = 'ntdll.dll';
  User32DLL   = 'User32.dll';

function ProcessUnderWow64(hProcess: THandle; Wow64Process: PBOOL): BOOL; stdcall; external Kernel32DLL name 'IsWow64Process';
function PathIsRelativeAnsi(pszPath: LPCSTR): BOOL; stdcall; external SHLWAPIDLL name 'PathIsRelativeA';
function PathIsRelativeUnicode(pszPath: LPCWSTR): BOOL; stdcall; external SHLWAPIDLL name 'PathIsRelativeW';
function GetGlobalMemoryStatusEx(lpBuffer: LPMEMORYSTATUSEX): BOOL; stdcall; external Kernel32DLL name 'GlobalMemoryStatusEx';
function PathCanonicalizeAnsi(pszBuf: LPSTR; pszPath: LPCSTR): BOOL; stdcall; external SHLWAPIDLL name 'PathCanonicalizeA';
function PathCanonicalizeUnicode(pszBuf: LPWSTR; pszPath: LPCWSTR): BOOL; stdcall; external SHLWAPIDLL name 'PathCanonicalizeW';
function PathIsUNCAnsi(pszPath: LPCSTR): BOOL; stdcall; external SHLWAPIDLL name 'PathIsUNCA';
function PathIsUNCUnicode(pszPath: LPCWSTR): BOOL; stdcall; external SHLWAPIDLL name 'PathIsUNCW';
function PathIsURLAnsi(pszPath: LPCSTR): BOOL; stdcall; external SHLWAPIDLL name 'PathIsURLA';
function PathIsURLUnicode(pszPath: LPCWSTR): BOOL; stdcall; external SHLWAPIDLL name 'PathIsURLW';
function ShutdownBlockReasonCreate(hWnd: HWND; Reason: LPCWSTR): Bool; stdcall; external User32DLL;
function ShutdownBlockReasonDestroy(hWnd: HWND): Bool; stdcall; external User32DLL;

由于链接问题,我遇到了以下错误:
Error: Unresolved external 'PathIsRelativeA' referenced from C:\REPOS\CEF4DELPHI\SOURCE\UCEFMISCFUNCTIONS.OBJ
Error: Unresolved external 'AlphaBlend' referenced from C:\REPOS\CEF4DELPHI\SOURCE\UCEFBUFFERPANEL.OBJ
Error: Unresolved external 'IsWow64Process' referenced from C:\REPOS\CEF4DELPHI\SOURCE\UCEFMISCFUNCTIONS.OBJ

这里是C++Builder生成的临时链接文件:MAKE0000.@@@

 -D"" -aa -Tpp -x -Gn -Gl -Gi -v -L..\source;..\packages;..\packages\res;..\addons;..\winlib;c:\windows\system32;L:\Lib;T:\bin\..\lib\obj;T:\bin\..\lib; +
 c0pkg32.obj vcl50.bpi Memmgr.Lib sysinit.obj ..\addons\MaxiSysUtils.obj   ..\source\uCEFAccessibilityHandler.obj   ..\source\uCEFApp.obj   ..\source\uCEFApplication.obj   ..\source\uCEFApplicationCore.obj   ..\source\uCEFAudioHandler.obj   ..\source\uCEFAuthCallback.obj   ..\source\uCEFBaseRefCounted.obj   ..\source\uCEFBaseScopedWrapper.obj   ..\source\uCEFBeforeDownloadCallback.obj   ..\source\uCEFBinaryValue.obj   ..\source\uCEFBitmapBitBuffer.obj   ..\source\uCEFBoxLayout.obj   ..\source\uCEFBrowser.obj   ..\source\uCEFBrowserProcessHandler.obj   ..\source\uCEFBrowserView.obj   ..\source\uCEFBrowserViewComponent.obj   ..\source\uCEFBrowserViewDelegate.obj   ..\source\uCEFBufferPanel.obj   ..\source\uCEFButton.obj   ..\source\uCEFButtonComponent.obj   ..\source\uCEFButtonDelegate.obj   ..\source\uCEFCallback.obj   ..\source\uCEFChromium.obj   ..\source\uCEFChromiumCore.obj   ..\source\uCEFChromiumEvents.obj   ..\source\uCEFChromiumFontOptions.obj   ..\source\uCEFChromiumOptions.obj   ..\source\uCEFChromiumWindow.obj   ..\source\uCEFClient.obj   ..\source\uCEFCommandLine.obj   ..\source\uCEFCompletionCallback.obj   ..\source\uCEFConstants.obj   ..\source\uCEFContextMenuHandler.obj   ..\source\uCEFContextMenuParams.obj   ..\source\uCEFCookieAccessFilter.obj   ..\source\uCEFCookieManager.obj   ..\source\uCEFCookieVisitor.obj   ..\source\uCEFCustomStreamReader.obj   ..\source\uCEFDeleteCookiesCallback.obj   ..\source\uCEFDevToolsMessageObserver.obj   ..\source\uCEFDialogHandler.obj   ..\source\uCEFDictionaryValue.obj   ..\source\uCEFDisplay.obj   ..\source\uCEFDisplayHandler.obj   ..\source\uCEFDomDocument.obj   ..\source\uCEFDomNode.obj   ..\source\uCEFDomVisitor.obj   ..\source\uCEFDownLoadItem.obj   ..\source\uCEFDownloadHandler.obj   ..\source\uCEFDownloadImageCallBack.obj   ..\source\uCEFDownloadItemCallback.obj   ..\source\uCEFDragAndDropMgr.obj   ..\source\uCEFDragData.obj   ..\source\uCEFDragHandler.obj   ..\source\uCEFEndTracingCallback.obj   ..\source\uCEFExtension.obj   ..\source\uCEFExtensionHandler.obj   ..\source\uCEFFileDialogCallback.obj   ..\source\uCEFFillLayout.obj   ..\source\uCEFFindHandler.obj   ..\source\uCEFFocusHandler.obj   ..\source\uCEFFrame.obj   ..\source\uCEFFrameHandler.obj   ..\source\uCEFGetExtensionResourceCallback.obj   ..\source\uCEFImage.obj   ..\source\uCEFInterfaces.obj   ..\source\uCEFJsDialogCallback.obj   ..\source\uCEFJsDialogHandler.obj   ..\source\uCEFJson.obj   ..\source\uCEFKeyboardHandler.obj   ..\source\uCEFLabelButton.obj   ..\source\uCEFLabelButtonComponent.obj   ..\source\uCEFLayout.obj   ..\source\uCEFLibFunctions.obj   ..\source\uCEFLifeSpanHandler.obj   ..\source\uCEFLinkedWinControlBase.obj   ..\source\uCEFLinkedWindowParent.obj   ..\source\uCEFListValue.obj   ..\source\uCEFLoadHandler.obj   ..\source\uCEFMediaObserver.obj   ..\source\uCEFMediaRoute.obj   ..\source\uCEFMediaRouteCreateCallback.obj   ..\source\uCEFMediaRouter.obj   ..\source\uCEFMediaSink.obj   ..\source\uCEFMediaSinkDeviceInfoCallback.obj   ..\source\uCEFMediaSource.obj   ..\source\uCEFMenuButton.obj   ..\source\uCEFMenuButtonComponent.obj   ..\source\uCEFMenuButtonDelegate.obj   ..\source\uCEFMenuButtonPressedLock.obj   ..\source\uCEFMenuModel.obj   ..\source\uCEFMenuModelDelegate.obj   ..\source\uCEFMiscFunctions.obj   ..\source\uCEFNavigationEntry.obj   ..\source\uCEFNavigationEntryVisitor.obj   ..\source\uCEFOAuth2Helper.obj   ..\source\uCEFOLEDragAndDrop.obj   ..\source\uCEFOSRIMEHandler.obj   ..\source\uCEFOverlayController.obj   ..\source\uCEFPDFPrintCallback.obj   ..\source\uCEFPDFPrintOptions.obj   ..\source\uCEFPanel.obj   ..\source\uCEFPanelComponent.obj   ..\source\uCEFPanelDelegate.obj   ..\source\uCEFPostData.obj   ..\source\uCEFPostDataElement.obj   ..\source\uCEFPrintDialogCallback.obj   ..\source\uCEFPrintHandler.obj   ..\source\uCEFPrintJobCallback.obj   ..\source\uCEFPrintSettings.obj   ..\source\uCEFProcessMessage.obj   ..\source\uCEFRegistration.obj   ..\source\uCEFRenderHandler.obj   ..\source\uCEFRenderProcessHandler.obj   ..\source\uCEFRequest.obj   ..\source\uCEFRequestContext.obj   ..\source\uCEFRequestContextHandler.obj   ..\source\uCEFRequestHandler.obj   ..\source\uCEFResolveCallback.obj   ..\source\uCEFResourceBundle.obj   ..\source\uCEFResourceBundleHandler.obj   ..\source\uCEFResourceHandler.obj   ..\source\uCEFResourceReadCallback.obj   ..\source\uCEFResourceRequestHandler.obj   ..\source\uCEFResourceSkipCallback.obj   ..\source\uCEFResponse.obj   ..\source\uCEFResponseFilter.obj   ..\source\uCEFRunContextMenuCallback.obj   ..\source\uCEFRunFileDialogCallback.obj   ..\source\uCEFSSLStatus.obj   ..\source\uCEFSchemeHandlerFactory.obj   ..\source\uCEFSchemeRegistrar.obj   ..\source\uCEFScrollView.obj   ..\source\uCEFScrollViewComponent.obj   ..\source\uCEFSelectClientCertificateCallback.obj   ..\source\uCEFSentinel.obj   ..\source\uCEFServer.obj   ..\source\uCEFServerComponent.obj   ..\source\uCEFServerEvents.obj   ..\source\uCEFServerHandler.obj   ..\source\uCEFSetCookieCallback.obj   ..\source\uCEFSslInfo.obj   ..\source\uCEFStreamReader.obj   ..\source\uCEFStreamWriter.obj   ..\source\uCEFStringList.obj   ..\source\uCEFStringMap.obj   ..\source\uCEFStringMultimap.obj   ..\source\uCEFStringVisitor.obj   ..\source\uCEFTask.obj   ..\source\uCEFTaskRunner.obj   ..\source\uCEFTextfield.obj   ..\source\uCEFTextfieldComponent.obj   ..\source\uCEFTextfieldDelegate.obj   ..\source\uCEFThread.obj   ..\source\uCEFTimerWorkScheduler.obj   ..\source\uCEFTypes.obj   ..\source\uCEFUrlRequest.obj   ..\source\uCEFUrlRequestClientComponent.obj   ..\source\uCEFUrlRequestClientEvents.obj   ..\source\uCEFUrlrequestClient.obj   ..\source\uCEFValue.obj   ..\source\uCEFView.obj   ..\source\uCEFViewComponent.obj   ..\source\uCEFViewDelegate.obj   ..\source\uCEFViewsFrameworkEvents.obj   ..\source\uCEFWaitableEvent.obj   ..\source\uCEFWebPluginInfo.obj   ..\source\uCEFWebPluginInfoVisitor.obj   ..\source\uCEFWebPluginUnstableCallback.obj   ..\source\uCEFWinControl.obj   ..\source\uCEFWindow.obj   ..\source\uCEFWindowComponent.obj   ..\source\uCEFWindowDelegate.obj   ..\source\uCEFWindowParent.obj   ..\source\uCEFWorkScheduler.obj   ..\source\uCEFWorkSchedulerQueueThread.obj   ..\source\uCEFWorkSchedulerThread.obj   ..\source\uCEFWriteHandler.obj   ..\source\uCEFX509CertPrincipal.obj   ..\source\uCEFX509Certificate.obj   ..\source\uCEFXmlReader.obj   ..\source\uCEFZipReader.obj   ..\source\uCEFv8Accessor.obj   ..\source\uCEFv8ArrayBufferReleaseCallback.obj   ..\source\uCEFv8Context.obj   ..\source\uCEFv8Exception.obj   ..\source\uCEFv8Handler.obj   ..\source\uCEFv8Interceptor.obj   ..\source\uCEFv8StackFrame.obj   ..\source\uCEFv8StackTrace.obj   ..\source\uCEFv8Value.obj   ..\packages\CEF4Delphi_Register.obj   maxicef.obj, +
 maxicef.bpl,, +
  Rxctl5.lib import32.lib cp32mti.lib, +
 , +
 maxicef.res ..\packages\res\chromium.dcr

你可以看到,c:\windows\system32; 被包含在路径中。

因此,我认为从32位应用程序导入64位DLL存在问题,整个互联网都说是真的。

我开始使用来自 Wine 的代码在单独的C++模块中重新实现这些函数,但实际上需要很多代码。突然间我发现我们另一个使用C++Builder 5构建的32位DLL实际上确实引用了64位DLL!

image

那么,如何从使用C++Builder 5构建的库中调用来自 System32 64位DLL的函数呢?

更新:

这里有证据表明这些函数实际上是从父DLL中导入的:

image

更新:

更多证据:

image

更新:

好的,这是 makefile:

# ---------------------------------------------------------------------------
!if !$d(BCB)
BCB = $(MAKEDIR)\..
!endif

# ---------------------------------------------------------------------------
# IDE SECTION
# ---------------------------------------------------------------------------
# The following section of the project makefile is managed by the BCB IDE.
# It is recommended to use the IDE to change any of the values in this
# section.
# ---------------------------------------------------------------------------

VERSION = BCB.05.03
# ---------------------------------------------------------------------------
PROJECT = maxicef.bpl
OBJFILES = \
#  ..\winlib\winlib.obj \
  ..\addons\MaxiSysUtils.obj \
  ..\source\uCEFAccessibilityHandler.obj \
  ..\source\uCEFApp.obj \
  ..\source\uCEFApplication.obj \
  ..\source\uCEFApplicationCore.obj \
  ..\source\uCEFAudioHandler.obj \
  ..\source\uCEFAuthCallback.obj \
  ..\source\uCEFBaseRefCounted.obj \
  ..\source\uCEFBaseScopedWrapper.obj \
  ..\source\uCEFBeforeDownloadCallback.obj \
  ..\source\uCEFBinaryValue.obj \
  ..\source\uCEFBitmapBitBuffer.obj \
  ..\source\uCEFBoxLayout.obj \
  ..\source\uCEFBrowser.obj \
  ..\source\uCEFBrowserProcessHandler.obj \
  ..\source\uCEFBrowserView.obj \
  ..\source\uCEFBrowserViewComponent.obj \
  ..\source\uCEFBrowserViewDelegate.obj \
  ..\source\uCEFBufferPanel.obj \
  ..\source\uCEFButton.obj \
  ..\source\uCEFButtonComponent.obj \
  ..\source\uCEFButtonDelegate.obj \
  ..\source\uCEFCallback.obj \
  ..\source\uCEFChromium.obj \
  ..\source\uCEFChromiumCore.obj \
  ..\source\uCEFChromiumEvents.obj \
  ..\source\uCEFChromiumFontOptions.obj \
  ..\source\uCEFChromiumOptions.obj \
  ..\source\uCEFChromiumWindow.obj \
  ..\source\uCEFClient.obj \
  ..\source\uCEFCommandLine.obj \
  ..\source\uCEFCompletionCallback.obj \
  ..\source\uCEFConstants.obj \
  ..\source\uCEFContextMenuHandler.obj \
  ..\source\uCEFContextMenuParams.obj \
  ..\source\uCEFCookieAccessFilter.obj \
  ..\source\uCEFCookieManager.obj \
  ..\source\uCEFCookieVisitor.obj \
  ..\source\uCEFCustomStreamReader.obj \
  ..\source\uCEFDeleteCookiesCallback.obj \
  ..\source\uCEFDevToolsMessageObserver.obj \
  ..\source\uCEFDialogHandler.obj \
  ..\source\uCEFDictionaryValue.obj \
  ..\source\uCEFDisplay.obj \
  ..\source\uCEFDisplayHandler.obj \
  ..\source\uCEFDomDocument.obj \
  ..\source\uCEFDomNode.obj \
  ..\source\uCEFDomVisitor.obj \
  ..\source\uCEFDownLoadItem.obj \
  ..\source\uCEFDownloadHandler.obj \
  ..\source\uCEFDownloadImageCallBack.obj \
  ..\source\uCEFDownloadItemCallback.obj \
  ..\source\uCEFDragAndDropMgr.obj \
  ..\source\uCEFDragData.obj \
  ..\source\uCEFDragHandler.obj \
  ..\source\uCEFEndTracingCallback.obj \
  ..\source\uCEFExtension.obj \
  ..\source\uCEFExtensionHandler.obj \
  ..\source\uCEFFileDialogCallback.obj \
  ..\source\uCEFFillLayout.obj \
  ..\source\uCEFFindHandler.obj \
  ..\source\uCEFFocusHandler.obj \
  ..\source\uCEFFrame.obj \
  ..\source\uCEFFrameHandler.obj \
  ..\source\uCEFGetExtensionResourceCallback.obj \
  ..\source\uCEFImage.obj \
  ..\source\uCEFInterfaces.obj \
  ..\source\uCEFJsDialogCallback.obj \
  ..\source\uCEFJsDialogHandler.obj \
  ..\source\uCEFJson.obj \
  ..\source\uCEFKeyboardHandler.obj \
  ..\source\uCEFLabelButton.obj \
  ..\source\uCEFLabelButtonComponent.obj \
  ..\source\uCEFLayout.obj \
  ..\source\uCEFLibFunctions.obj \
  ..\source\uCEFLifeSpanHandler.obj \
  ..\source\uCEFLinkedWinControlBase.obj \
  ..\source\uCEFLinkedWindowParent.obj \
  ..\source\uCEFListValue.obj \
  ..\source\uCEFLoadHandler.obj \
  ..\source\uCEFMediaObserver.obj \
  ..\source\uCEFMediaRoute.obj \
  ..\source\uCEFMediaRouteCreateCallback.obj \
  ..\source\uCEFMediaRouter.obj \
  ..\source\uCEFMediaSink.obj \
  ..\source\uCEFMediaSinkDeviceInfoCallback.obj \
  ..\source\uCEFMediaSource.obj \
  ..\source\uCEFMenuButton.obj \
  ..\source\uCEFMenuButtonComponent.obj \
  ..\source\uCEFMenuButtonDelegate.obj \
  ..\source\uCEFMenuButtonPressedLock.obj \
  ..\source\uCEFMenuModel.obj \
  ..\source\uCEFMenuModelDelegate.obj \
  ..\source\uCEFMiscFunctions.obj \
  ..\source\uCEFNavigationEntry.obj \
  ..\source\uCEFNavigationEntryVisitor.obj \
  ..\source\uCEFOAuth2Helper.obj \
  ..\source\uCEFOLEDragAndDrop.obj \
  ..\source\uCEFOSRIMEHandler.obj \
  ..\source\uCEFOverlayController.obj \
  ..\source\uCEFPDFPrintCallback.obj \
  ..\source\uCEFPDFPrintOptions.obj \
  ..\source\uCEFPanel.obj \
  ..\source\uCEFPanelComponent.obj \
  ..\source\uCEFPanelDelegate.obj \
  ..\source\uCEFPostData.obj \
  ..\source\uCEFPostDataElement.obj \
  ..\source\uCEFPrintDialogCallback.obj \
  ..\source\uCEFPrintHandler.obj \
  ..\source\uCEFPrintJobCallback.obj \
  ..\source\uCEFPrintSettings.obj \
  ..\source\uCEFProcessMessage.obj \
  ..\source\uCEFRegistration.obj \
  ..\source\uCEFRenderHandler.obj \
  ..\source\uCEFRenderProcessHandler.obj \
  ..\source\uCEFRequest.obj \
  ..\source\uCEFRequestContext.obj \
  ..\source\uCEFRequestContextHandler.obj \
  ..\source\uCEFRequestHandler.obj \
  ..\source\uCEFResolveCallback.obj \
  ..\source\uCEFResourceBundle.obj \
  ..\source\uCEFResourceBundleHandler.obj \
  ..\source\uCEFResourceHandler.obj \
  ..\source\uCEFResourceReadCallback.obj \
  ..\source\uCEFResourceRequestHandler.obj \
  ..\source\uCEFResourceSkipCallback.obj \
  ..\source\uCEFResponse.obj \
  ..\source\uCEFResponseFilter.obj \
  ..\source\uCEFRunContextMenuCallback.obj \
  ..\source\uCEFRunFileDialogCallback.obj \
  ..\source\uCEFSSLStatus.obj \
  ..\source\uCEFSchemeHandlerFactory.obj \
  ..\source\uCEFSchemeRegistrar.obj \
  ..\source\uCEFScrollView.obj \
  ..\source\uCEFScrollViewComponent.obj \
  ..\source\uCEFSelectClientCertificateCallback.obj \
  ..\source\uCEFSentinel.obj \
  ..\source\uCEFServer.obj \
  ..\source\uCEFServerComponent.obj \
  ..\source\uCEFServerEvents.obj \
  ..\source\uCEFServerHandler.obj \
  ..\source\uCEFSetCookieCallback.obj \
  ..\source\uCEFSslInfo.obj \
  ..\source\uCEFStreamReader.obj \
  ..\source\uCEFStreamWriter.obj \
  ..\source\uCEFStringList.obj \
  ..\source\uCEFStringMap.obj \
  ..\source\uCEFStringMultimap.obj \
  ..\source\uCEFStringVisitor.obj \
  ..\source\uCEFTask.obj \
  ..\source\uCEFTaskRunner.obj \
  ..\source\uCEFTextfield.obj \
  ..\source\uCEFTextfieldComponent.obj \
  ..\source\uCEFTextfieldDelegate.obj \
  ..\source\uCEFThread.obj \
  ..\source\uCEFTimerWorkScheduler.obj \
  ..\source\uCEFTypes.obj \
  ..\source\uCEFUrlRequest.obj \
  ..\source\uCEFUrlRequestClientComponent.obj \
  ..\source\uCEFUrlRequestClientEvents.obj \
  ..\source\uCEFUrlrequestClient.obj \
  ..\source\uCEFValue.obj \
  ..\source\uCEFView.obj \
  ..\source\uCEFViewComponent.obj \
  ..\source\uCEFViewDelegate.obj \
  ..\source\uCEFViewsFrameworkEvents.obj \
  ..\source\uCEFWaitableEvent.obj \
  ..\source\uCEFWebPluginInfo.obj \
  ..\source\uCEFWebPluginInfoVisitor.obj \
  ..\source\uCEFWebPluginUnstableCallback.obj \
  ..\source\uCEFWinControl.obj \
  ..\source\uCEFWindow.obj \
  ..\source\uCEFWindowComponent.obj \
  ..\source\uCEFWindowDelegate.obj \
  ..\source\uCEFWindowParent.obj \
  ..\source\uCEFWorkScheduler.obj \
  ..\source\uCEFWorkSchedulerQueueThread.obj \
  ..\source\uCEFWorkSchedulerThread.obj \
  ..\source\uCEFWriteHandler.obj \
  ..\source\uCEFX509CertPrincipal.obj \
  ..\source\uCEFX509Certificate.obj \
  ..\source\uCEFXmlReader.obj \
  ..\source\uCEFZipReader.obj \
  ..\source\uCEFv8Accessor.obj \
  ..\source\uCEFv8ArrayBufferReleaseCallback.obj \
  ..\source\uCEFv8Context.obj \
  ..\source\uCEFv8Exception.obj \
  ..\source\uCEFv8Handler.obj \
  ..\source\uCEFv8Interceptor.obj \
  ..\source\uCEFv8StackFrame.obj \
  ..\source\uCEFv8StackTrace.obj \
  ..\source\uCEFv8Value.obj \
  ..\packages\CEF4Delphi_Register.obj \
  maxicef.obj
RESFILES = maxicef.res ..\packages\res\chromium.dcr
MAINSOURCE = maxicef.cpp
RESDEPEN = $(RESFILES)
LIBFILES = 
IDLFILES = 
IDLGENFILES = 
LIBRARIES = Rxctl5.lib
PACKAGES = vcl50.bpi
SPARELIBS = Vcl50.lib Rxctl5.lib
DEFFILE = 
# ---------------------------------------------------------------------------
PATHCPP = .;..\winlib;
PATHASM = .;
PATHPAS = .;..\source;..\packages;..\addons;
PATHRC = .;..\packages\res;
DEBUGLIBPATH = $(BCB)\lib\debug;
RELEASELIBPATH = $(BCB)\lib\release
USERDEFINES = _DEBUG;MSWINDOWS;CPUX32;TARGET_32BITS;VER130;
SYSDEFINES = _RTLDLL;NO_STRICT;USEPACKAGES
INCLUDEPATH = ..\source;..\packages;..\addons;..\winlib;$(BCB)\include;$(BCB)\include\vcl
LIBPATH = ..\source;..\packages;..\packages\res;..\addons;..\winlib;c:\windows\system32;c:\windows\SysWOW64;L:\Lib;$(BCB)\lib\obj;$(BCB)\lib;
WARNINGS= -w-par
# ---------------------------------------------------------------------------
CFLAG1 = -Od -Vx -Ve -X- -r- -a8 -b- -k -y -v -vi- -c -tWM -H=vcl50.csm
IDLCFLAGS = -I..\source -I..\packages -I..\addons -I..\winlib -I$(BCB)\include -I$(BCB)\include\vcl \
    -src_suffix cpp -D_DEBUG -DMSWINDOWS -DCPUX32 -DTARGET_32BITS -DVER130 -boa
PFLAGS = -$YD -$W -$O- -v -JPHNE -M
RFLAGS = 
AFLAGS = /mx /w2 /zd
LFLAGS = -D"" -aa -Tpp -x -Gn -Gl -Gi -v
# ---------------------------------------------------------------------------
ALLOBJ = c0pkg32.obj $(PACKAGES) Memmgr.Lib sysinit.obj $(OBJFILES)
ALLRES = $(RESFILES)
ALLLIB = $(LIBFILES) $(LIBRARIES) import32.lib cp32mti.lib
# ---------------------------------------------------------------------------
!ifdef IDEOPTIONS

[Version Info]
IncludeVerInfo=0
AutoIncBuild=0
MajorVer=1
MinorVer=0
Release=0
Build=0
Debug=0
PreRelease=0
Special=0
Private=0
DLL=0

[Version Info Keys]
CompanyName=
FileDescription=
FileVersion=1.0.0.0
InternalName=
LegalCopyright=
LegalTrademarks=
OriginalFilename=
ProductName=
ProductVersion=1.0.0.0
Comments=

[Debugging]
DebugSourceDirs=$(BCB)\source\vcl

!endif





# ---------------------------------------------------------------------------
# MAKE SECTION
# ---------------------------------------------------------------------------
# This section of the project file is not used by the BCB IDE.  It is for
# the benefit of building from the command-line using the MAKE utility.
# ---------------------------------------------------------------------------

.autodepend
# ---------------------------------------------------------------------------
!if "$(USERDEFINES)" != ""
AUSERDEFINES = -d$(USERDEFINES:;= -d)
!else
AUSERDEFINES =
!endif

!if !$d(BCC32)
BCC32 = bcc32ide
!endif

!if !$d(CPP32)
CPP32 = cpp32
!endif

!if !$d(DCC32)
DCC32 = dcc32
!endif

!if !$d(TASM32)
TASM32 = tasm32
!endif

!if !$d(LINKER)
LINKER = ilink32
!endif

!if !$d(BRCC32)
BRCC32 = brcc32
!endif


# ---------------------------------------------------------------------------
!if $d(PATHCPP)
.PATH.CPP = $(PATHCPP)
.PATH.C   = $(PATHCPP)
!endif

!if $d(PATHPAS)
.PATH.PAS = $(PATHPAS)
!endif

!if $d(PATHASM)
.PATH.ASM = $(PATHASM)
!endif

!if $d(PATHRC)
.PATH.RC  = $(PATHRC)
!endif
# ---------------------------------------------------------------------------
$(PROJECT): $(IDLGENFILES) $(OBJFILES) $(RESDEPEN) $(DEFFILE)
    $(BCB)\BIN\$(LINKER) @&&!
    $(LFLAGS) -L$(LIBPATH) +
    $(ALLOBJ), +
    $(PROJECT),, +
    $(ALLLIB), +
    $(DEFFILE), +
    $(ALLRES)
!
# ---------------------------------------------------------------------------
.pas.hpp:
    $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< }

.pas.obj:
    $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< }

.cpp.obj:
    $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< }

.c.obj:
    $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< }

.c.i:
    $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< }

.cpp.i:
    $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< }

.asm.obj:
    $(BCB)\BIN\$(TASM32) $(AFLAGS) -i$(INCLUDEPATH:;= -i) $(AUSERDEFINES) -d$(SYSDEFINES:;= -d) $<, $@

.rc.res:
    $(BCB)\BIN\$(BRCC32) $(RFLAGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -fo$@ $<
# ---------------------------------------------------------------------------

更新

针对@PaulMcKenzie:我有一个64位操作系统,需要使用Borland C++Builder 5构建32位应用程序以在64位操作系统上运行。我的问题是当我从我的.pas文件中引用Windows DLLs中的Windows函数时,出现了未解决的外部错误(Unresolved external errors)。


3
您的32位DLL不引用64位DLL。您无法将32位模块加载到64位进程中,或将64位模块加载到32位进程中。 - IInspectable
4
所以 Dependency Walker 说谎了吗? - 是的。 - RbMm
2
这就是为什么有两个版本的_Dependency Walker_可用:64位32位。检查32位模块时,请使用32位Dependency Walker,以便默认情况下不会假定所有依赖模块都是64位的。在屏幕截图中所看到的是,64位Dependency Walker仅假定链接的Windows DLL为64位,并且失败了(请注意那些64位图标被涂成红色,这意味着存在问题)。 - heap underrun
2
如果您在 C++ 代码中引用 Win32 函数并通过 C++ 链接器传递,则需要在构建过程中包含相关的导入 .lib(例如 Kernel32.libShlwapi.lib 等)。这些 .lib 已经在 BCB 的安装中提供了。但是,一些您正在使用的函数在 BCB5 发布之前可能尚不存在(或者是不久前引入的),因此它们可能不存在于提供的 .lib 中,因此您需要使用 BCB 的 IMPLIB 工具从最新的 .DLL 生成更新的 .lib - Remy Lebeau
3
@OlgaPshenichnikova... 但这并不适用于 Pascal 代码。引用 .DLLexternal 声明将在编译时生成适当的链接,以在运行时加载该 .DLL ,无需使用任何导入 .lib 。无论通过 C++ 还是 Pascal 进行链接,如果您的应用程序是 32 位的,则在运行时它只会加载 32 位 DLL,使用 系统搜索路径 来查找它们。因此,在 64 位操作系统上加载 32 位系统 DLL 将从 %WINDIR%\SysWOW64 文件夹中加载,而不是从 %WINDIR%\System32 文件夹中加载。 - Remy Lebeau
显示剩余26条评论
1个回答

2

好的,非常感谢你们让我了解了DLL导入的过程。

正如和所说 - 导入DLL需要与LIB链接。这里有更多的解释。同时请搜索 - "将共享库链接到可执行文件"。无论是.so还是.dll,原则都是相同的,这一点并不重要。

在我提供解决方案之前,还有一个重要的问题。

正如所说:有几个函数

在BCB5发布之前还不存在(或者是在短时间内引入的)

解决方案

第一步

修复makefile

LIBRARIES = Rxctl5.lib shlwapi.lib kernel32.lib user32.lib
LIBPATH = ...;..\libs;
  1. LIBRARIES部分添加所有必要的.lib文件。
  2. LIBPATH部分将新文件夹添加到路径中。

其次

尽管您的BCB安装中已经存在带有.lib函数的文件夹:

enter image description here

您需要重新创建.lib文件。我已经在虚拟驱动器T:\上安装了Borland C++ builder

> cd ..\libs
> T:\Bin\implib.exe kernel32.lib c:\Windows\SysWOW64\kernel32.dll

我把库放在相对于makefile的文件夹..\libs中。

第三步

Borland编译器存在一个错误。它无法编译从类方法调用外部函数,因此您需要添加代理:

unit uCEFMiscFunctions;

interface

const
  Kernel32DLL = 'kernel32.dll';

{$IFDEF MSWINDOWS}
function GetGlobalMemoryStatusEx_(lpBuffer: LPMEMORYSTATUSEX): BOOL;
function GetGlobalMemoryStatusEx(lpBuffer: LPMEMORYSTATUSEX): BOOL; stdcall; external Kernel32DLL name 'GlobalMemoryStatusEx';
{$ENDIF}

implementation

{$IFDEF MSWINDOWS}
function GetGlobalMemoryStatusEx_(lpBuffer: LPMEMORYSTATUSEX): BOOL;
begin
  Result := GetGlobalMemoryStatusEx(lpBuffer);
end;
{$ENDIF}

unit uCEFApplicationCore;
...
function TCefApplicationCore.GetTotalSystemMemory : UInt64;
{$IFDEF MSWINDOWS}
var
  TempMemStatus : TMyMemoryStatusEx;
{$ENDIF}
begin
  Result := 0;
  {$IFDEF MSWINDOWS}
  ZeroMemory(@TempMemStatus, SizeOf(TMyMemoryStatusEx));
  TempMemStatus.dwLength := SizeOf(TMyMemoryStatusEx);
  if GetGlobalMemoryStatusEx_(@TempMemStatus) then
  if True then
    Result := TempMemStatus.ullTotalPhys;
  {$ENDIF}
end;

1
解决方案的第三部分在C++Builder 10.2中为我解决了问题。 - riot_starter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接