从 32 位 DLL 访问 64 位 DLL

Olg*_*ova 5 c++ dll winapi c++builder c++builder-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;
Run Code Online (Sandbox Code Playgroud)

由于链接,我收到如下错误:

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
Run Code Online (Sandbox Code Playgroud)

这是MAKE0000.@@@来自 C++Builder 的临时链接文件:

 -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
Run Code Online (Sandbox Code Playgroud)

如您所见,c:\windows\system32;包含在路径中。

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

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

图像

System32那么,从使用 C++Builder 5 构建的库中调用 64 位 DLL 中的函数有什么技巧呢?

更新

以下证据表明这些函数实际上是从父 DLL 导入的:

图像

更新

多一个证据:

图像

更新

好的,这是 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





# ---

Olg*_*ova 2

好的,谢谢大家,让我了解了DLL导入的过程。

正如IInspectableRemy Lebeau所说 - 的导入DLL需要与LIB. 这里有更多解释。还谷歌 - “将共享库链接到可执行文件”。是还是.so不是并不重要.dll,原理都是一样的。

在我给出解决方案之前还有一个重要的观点。

如前所述Remy Lebeau:几个功能

BCB5 发布时尚不存在(或不久前引入)

解决方案

第一的

修复 makefile

LIBRARIES = Rxctl5.lib shlwapi.lib kernel32.lib user32.lib
LIBPATH = ...;..\libs;
Run Code Online (Sandbox Code Playgroud)
  1. 在部分中添加所有必需的.lib文件LIBRARIES
  2. 将新文件夹添加到LIBPATH部分的路径中。

第二

尽管.lib您的安装中存在具有功能的文件夹BCB

在此输入图像描述

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

> cd ..\libs
> T:\Bin\implib.exe kernel32.lib c:\Windows\SysWOW64\kernel32.dll
Run Code Online (Sandbox Code Playgroud)

我将库放在..\libs相对于makefile.

第三

的编译器有一个错误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}
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)