2010-09-17 8 views
0

Je sais que le titre semble un peu étrange, mais cela a été ahurissant mon esprit un peu. Donc, Intel offre ce gadget barre latérale TurboBoost avec des appels en utilisant JavaScript, et je veux écrire un programme à partir de zéro en C# qui fait la même chose. Les appels proviennent de ce que je crois être une DLL ActiveX que j'ai facilement importé. Le problème est, chaque fois que j'essaie d'appeler une fonction, il me donne l'erreur "une référence d'objet est nécessaire pour le champ non-statique ..." J'ai trouvé toutes les fonctions par ex. celui que j'ai utilisé renvoie une structure de données dynamique. J'ai essayé de diviser les fonctions et les ai rendues toutes les deux statiques mais toujours pas de chance. Voici le code (ITurboBoostClient est la partie d'interface):Appel d'une fonction dynamique dans une erreur d'objet

namespace TurboBoostMon_CLI 
{ 
    class Program 
    { 
     public static object GetCPUFreq() 
     { 
      object n = ITurboBoostClient.GetCurBaseFrequency(); //<---- error 
      //return Convert.ToDouble(n); 
      return n; 
     } 

     public static void Main(string[] args) 
     { 
      object cpubasefreq = GetCPUFreq(); 
      Console.WriteLine(cpubasefreq); // neglect the output for now 
     } 
    } 
} 

Répondre

1

Si les conventions de nommage typiques sont utilisés, ITurboBoostClient est un interface, et vous ne disposez pas d'une instance d'un objet qui implémente l'interface. Par conséquent, l'erreur.

Sans savoir plus sur la DLL ActiveX, il est difficile de dire exactement ce qu'il faut faire, mais ce serait le long des lignes de:

{ 
    ITurboBoostClient myClient = TurboBoostFactory.GetInstance(); 
    object n = myClient.GetCurBaseFrequencey(); 
    return n; 
} 

Notez que dans la première ligne, vous appelez une méthode statique peut produire la classe (avec l'interface) requise. Ensuite, vous pouvez réellement utiliser cette interface.

Regardez à nouveau dans la bibliothèque ActiveX que vous avez importé, et voyez si vous pouvez trouver une méthode de fabrication, une méthode CreateInstance ou une autre instantiateur qui va créer l'objet initial.

0

Si vous obtenez cette erreur, vous devez déclarer quelque chose comme un nouvel objet. En supposant que votre marqueur d'erreur est correct, vous devez le modifier pour créer une nouvelle instance d'un objet qui hérite de ITurboBoostClient, puis l'utiliser pour appeler la méthode GetCurBaseFrequenct().

Quelque chose comme:

ITurboBoostClient myTurboBoost = new TurboBoostClientObject(); // Making names up here, not familiar with the framework you're working with. 
object n = myTurboBoost.GetCurBaseFrequency(); 

Désolé je ne sais pas quelle classe vous devez instancier là, mais une courte fouille sur google sera très certainement révélateur.

+0

Très semblable à ma réponse, avec la mise en garde que le nouveau ne fonctionnera probablement pas, car ce programme n'a presque certainement pas la définition complète de la classe ou la connaissance de comment l'instancier. C'est pourquoi j'ai poussé à trouver une méthode statique dans la bibliothèque. – abelenky

+0

La plupart de ce que j'ai travaillé avec ActiveX a fourni un accès direct pour instancier une nouvelle instance d'un objet. Cependant, c'est un peu limité, alors ce n'est peut-être pas toujours le cas. –

Questions connexes