我正在将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位操作系统上运行。我的问题是当我从我的.pas
文件中引用Windows DLLs中的Windows函数时,出现了未解决的外部错误(Unresolved external
errors)。
.lib
(例如Kernel32.lib
、Shlwapi.lib
等)。这些.lib
已经在 BCB 的安装中提供了。但是,一些您正在使用的函数在 BCB5 发布之前可能尚不存在(或者是不久前引入的),因此它们可能不存在于提供的.lib
中,因此您需要使用 BCB 的IMPLIB
工具从最新的.DLL
生成更新的.lib
。 - Remy Lebeau.DLL
的external
声明将在编译时生成适当的链接,以在运行时加载该.DLL
,无需使用任何导入.lib
。无论通过 C++ 还是 Pascal 进行链接,如果您的应用程序是 32 位的,则在运行时它只会加载 32 位 DLL,使用 系统搜索路径 来查找它们。因此,在 64 位操作系统上加载 32 位系统 DLL 将从%WINDIR%\SysWOW64
文件夹中加载,而不是从%WINDIR%\System32
文件夹中加载。 - Remy Lebeau