【问题标题】:Access 64 bit DLL from 32 bit DLL从 32 位 DLL 访问 64 位 DLL
【发布时间】:2022-01-20 11:30:50
【问题描述】:

我正在将 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!

那么,从使用 C++Builder 5 构建的库中调用 System32 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





# ---------------------------------------------------------------------------
# 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 位操作系统上运行。我遇到的问题是Unresolved external 错误的问题,当我从.pas 文件中引用驻留在Windows DLL 中的Windows 函数时。

【问题讨论】:

  • 您的 32 位 DLL 不引用 64 位 DLL。不能将 32 位模块加载到 64 位进程中,也不能将 64 位模块加载到 32 位进程中。
  • 所以 Dependecy Walker 在撒谎? - 是的
  • 这就是为什么有两个版本的 Dependency Walker 可用:64-bit32-bit。检查 32 位模块时,请使用 32 位 Dependency Walker,因此不会默认所有依赖模块都是 64 位的。您在屏幕截图中看到的是 64 位 Dependency Walker 只是假设链接的 Windows DLL 是 64 位的,并且失败了(注意这些 64 位图标是如何涂成红色的,这意味着存在问题)。跨度>
  • @OlgaPshenichnikova 如果您在通过 C++ 链接器的 C++ 代码中引用 Win32 函数,那么您需要包含相关导入 .libs (Kernel32.libShlwapi.lib 等)在您的构建中。这些.libs 在 BCB 的安装中提供。但是,您正在使用的某些功能在 BCB5 发布时还不存在(或不久前引入),因此它们可能不存在于提供的.libs 中,因此您需要生成更新的.libs从最新的.DLLs 使用 BCB 的IMPLIB 工具...
  • @OlgaPshenichnikova ...也就是说,这一切都不适用于 Pascal 代码。引用.DLLexternal 声明将在编译时生成正确的链接以在运行时加载.DLL,不使用导入.libs。无论哪种方式,无论您是通过 C++ 还是 Pascal 链接,如果您的应用程序是 32 位的,则在运行时它将仅加载 32 位 DLL,使用 system search path 来查找它们。因此,64 位操作系统上的 32 位系统 DLL 将从 %WINDIR%\SysWOW64 文件夹加载,而不是从 %WINDIR%\System32 文件夹加载。

标签: c++ winapi dll c++builder c++builder-5


【解决方案1】:

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

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

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

正如Remy Lebeau所说:几个功能

BCB5 发布时还不存在(或不久前推出)

解决方案

首先

修复生成文件

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

第二

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

您需要重新创建 .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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-18
    • 2011-04-16
    • 1970-01-01
    • 2013-06-08
    • 2014-07-18
    • 1970-01-01
    • 2016-08-28
    • 2016-03-26
    相关资源
    最近更新 更多