Réponses:
Il y a peu de différence; module_invoke_all()exécute le code suivant:
function module_invoke_all() {
  $args = func_get_args();
  $hook = $args[0];
  unset($args[0]);
  $return = array();
  foreach (module_implements($hook) as $module) {
    $function = $module . '_' . $hook;
    if (function_exists($function)) {
      $result = call_user_func_array($function, $args);
      if (isset($result) && is_array($result)) {
        $return = array_merge_recursive($return, $result);
      }
      elseif (isset($result)) {
        $return[] = $result;
      }
    }
  }
  return $return;
}
La seule différence est qu'avec module_invoke_all(), par exemple, func_get_args()n'est invoqué qu'une seule fois, alors que lors de l'utilisation module_invoke() func_get_args()est appelée chaque fois module_invoke()est appelée; c'est une différence marginale, cependant. 
Il y a quelques cas où module_implementing()et module_invoke()sont utilisés, normalement quand un module a besoin de savoir quel module est appelé, comme dans le cas search_get_info()qui construit un tableau d'informations sur les modules implémentant des fonctions de recherche.
function search_get_info($all = FALSE) {
  $search_hooks = &drupal_static(__FUNCTION__);
  if (!isset($search_hooks)) {
    foreach (module_implements('search_info') as $module) {
      $search_hooks[$module] = call_user_func($module . '_search_info');
      // Use module name as the default value.
      $search_hooks[$module] += array(
        'title' => $module,
        'path' => $module,
      );
      // Include the module name itself in the array.
      $search_hooks[$module]['module'] = $module;
    }
  }
  if ($all) {
    return $search_hooks;
  }
  $active = variable_get('search_active_modules', array('node', 'user'));
  return array_intersect_key($search_hooks, array_flip($active));
}
Un autre exemple est image_styles () , qui obtient la liste de tous les styles d'image implémentés par les modules, et qui utilise le code suivant:
  foreach (module_implements('image_default_styles') as $module) {
    $module_styles = module_invoke($module, 'image_default_styles');
    foreach ($module_styles as $style_name => $style) {
      $style['name'] = $style_name;
      $style['module'] = $module;
      $style['storage'] = IMAGE_STORAGE_DEFAULT;
      foreach ($style['effects'] as $key => $effect) {
        $definition = image_effect_definition_load($effect['name']);
        $effect = array_merge($definition, $effect);
        $style['effects'][$key] = $effect;
      }
      $styles[$style_name] = $style;
    }
  }
Dans les deux cas, les informations récupérées sont placées dans un tableau où l'index est le nom court du module.
Lorsque vous regardez le code, module_invoke_all fait exactement cela, plus quelques vérifications de santé mentale. Et c'est facile. :-)
Il vaut probablement mieux n'utiliser ni l'un ni l'autre, et utiliser à la place drupal_alter () .
Comme indiqué dans la documentation module_invoke_all () ,
Tous les arguments sont passés par valeur. Utilisez drupal_alter () si vous devez passer des arguments par référence.