很抱歉,这是一个琐碎的问题,但我已尽力搜索,而且找不到任何解决方法。
我有一个Delphi / FMX应用程序,它为Win32创建一个DLL,为macOS(High Sierra)创建一个DYLIB(32位)。
在一个单元中,我只是使用GetModuleName(hInstance)
来获得使用该单元的模块的名称,并且在Win32和Win64中可以正常工作。例如,如果主程序正在使用本机,它将返回主程序名称。但是,如果主程序使用的DLL使用该单元,它将返回DLL名称。我正在使用它为主程序及其调用的任何DLL创建单独的日志文件,并使用在日志文件名中重新调整的名称。
Windows中有效的代码(在使用FMX创建的DYLIB(OSX)/ DLL(Win32)使用的单元中)是:
sModuleName := TPath.GetFileNameWithoutExtension(GetModuleName(hInstance));
GetModulename
位于System.SysUtils单元和AFAIK中,没有针对Windows / OSX等的条件定义。我的假设(显然是错误的)是,它应在为OSX构建时起作用。并非如此,它没有错误地挂在该行上,只是FORCE QUIT窗口中的一个“((无响应)”)。我已经在macOS VM和硬macOS系统上尝试了此方法,结果相同。
是否需要做一些其他事情才能使GetModuleName与OSX一起使用?
和/或
如果我为OSX进行构建,是否有某些东西(类似)可以检索模块名称?
答案 0 :(得分:0)
如前所述,问题实际上是日志文件Unit不知道从何处引用它,但是引用的Unit / Module知道它自己的名字吗?
因此,解决方法(也是一种解决方法)是将实际的调用移至执行日志文件创建的函数,而不是将日志文件单元中的Initialze块移出(即,将其放入名为LogFileSetup的函数中,并带有一个单个参数:调用单元名称),然后在调用单元的Initialize Block的开始处对该函数进行调用。因此,在呼叫单元中,例如:
initialization
// Setup the log file
if not(LogFileSetup('MyModuleName')) then
ShowMessage('Logfile setup error');
还有LogFile单元中的函数(供参考,我使用的是Log4Pascal,它是免费,简单且有效的):
function LogFileSetup(sModuleName : string): Boolean;
begin
try
Result := True;
{$IFDEF MSWINDOWS}
sLogFolder := IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))) + 'logs';
{$ENDIF MSWINDOWS}
{$IFDEF MACOS}
sLogFolder := IncludeTrailingPathDelimiter(GetHomePath) + 'Library/Logs/MyAppName';
{$ENDIF MACOS}
if not(DirectoryExists(sLogFolder)) then
ForceDirectories(sLogFolder);
sLogFile := IncludeTrailingPathDelimiter(sLogFolder) + sModuleName + '_' + FormatDateTime('YYYYMMDD', now) + '_' + FormatDateTime('hhmmsszzz',now) + '.log';
EMPLogger := TLogger.Create(sLogFile);
EMPLogger.getLogLevel;
// INFO log message
EMPLogger.Info('[Log4Pascal] Logging commenced');
except
Result := False;
end;
end;
当然,如果有人对这个问题有答案:是否有一个OSX等效于:
GetModuleName(hInstance)
那太好了。
答案 1 :(得分:0)
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.MediaController;
import android.widget.VideoView;
import java.io.File;
import android.Manifest;
import android.app.Activity;
import android.graphics.PixelFormat;
import android.os.Environment;
public class VideoPlayback extends AppCompatActivity {
private VideoView video;
private MediaController mc;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video_playback);
/* File clip=new File("file:///android_asset/c10y16q3.mp4");
video.setVideoPath(clip.getAbsolutePath()); */
video = (VideoView)findViewById(R.id.videoView2);
video.setVideoPath("file:///android_asset/bihu_dance.mp4");
/* Method 2
Uri uri = Uri.parse("file:///android_asset/bihu_dance.mp4");
video.setVideoURI(uri);
mc=new MediaController(this);
mc.setMediaPlayer(video);
video.setMediaController(mc);
video.requestFocus(); */
video.start();
}
}
也存在于MacOS上。我认为您的问题不是该函数不存在,而是您不应该在GetModuleName
部分中调用它。通常,必须避免在初始化部分调用其他dll / dylib,以免触发加载程序锁定。