调用应用程序名称FMX OSX

时间:2019-01-03 00:58:06

标签: macos delphi firemonkey delphi-10.2-tokyo

很抱歉,这是一个琐碎的问题,但我已尽力搜索,而且找不到任何解决方法。

我有一个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进行构建,是否有某些东西(类似)可以检索模块名称?

2 个答案:

答案 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,以免触发加载程序锁定。