Auslesen, welchr datei type mit welchem programm gestartet w

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

creed steiger hat geschrieben:KDE regelt das intern so:
http://developer.kde.org/documentation/ ... /mime.html" onclick="window.open(this.href);return false;
muss ich mir mal näher betrachten
Hmm, ob es wohl am einfachsten wäre, ein shared object in C++ mit einem C Interface zu basteln um da ranzukommen?

creed steiger
Beiträge: 958
Registriert: Mo 11. Sep 2006, 22:56

Beitrag von creed steiger »

theo hat geschrieben:[
Hmm, ob es wohl am einfachsten wäre, ein shared object in C++ mit einem C Interface zu basteln um da ranzukommen?
Sicher
Ich weiß aber nicht ob das in KDE4 evt. anders als in KDE3 geregelt wird.
Mal sehen.
Allgemein sind die ganzen KDE Sachen hochinteressant.

Edit:so geht Gnome vor:
http://library.gnome.org/devel/gnome-vf ... pplication" onclick="window.open(this.href);return false;

hanibal
Beiträge: 369
Registriert: Sa 3. Mär 2007, 16:03
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Bramsche (Emsland)

Beitrag von hanibal »

währe eigentlich mal cool, wen jemand dafür mal eine libary schreiben würde, um darauf von lazarus aus zugriff zu haben, am besten für kde und gnome. Kann hier jemand c++?

knight
Beiträge: 802
Registriert: Mi 13. Sep 2006, 22:30

Beitrag von knight »

mit einem C Interface zu basteln
Vielleicht hilft ja diese Seite weiter: http://wiki.lazarus.freepascal.org/H2Pas" onclick="window.open(this.href);return false;

knight

creed steiger
Beiträge: 958
Registriert: Mo 11. Sep 2006, 22:56

Beitrag von creed steiger »

http://free-programming-ebooks.blogspot ... ascal.html" onclick="window.open(this.href);return false;

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Hab keine Ahnung von C++ aber ich hab's mal probiert.
Funzt bei mir. Aber da kann man bestimmt noch viel verbessern, ist nur so hingehackt.
Muss ins Bett. ;-)

Code: Alles auswählen

#include <kmimetype.h>
#include <kservice.h>
#include <kuserprofile.h>
#include <kinstance.h>
#include <iostream>
 
//g++ sharedl.cpp -I/opt/kde3/include -I$QTDIR/include -c
//g++ -shared -Wl,-soname,libmime.so -o libmime.so.1.0.0 sharedl.o -L/opt/kde3/lib -L$QTDIR/lib -lkparts -lkdecore -lkio
extern "C" {
 
 
char* Get_MIME_Type(char* URL) {
 KInstance *Inst = new KInstance("kdemime-test");
 KMimeType::Ptr type = KMimeType::findByURL(QString(URL));
 QString AMime="";
 
 if (type->name() == KMimeType::defaultMimeType()) 
    AMime=""; else  AMime=type->name();
 
 char *str=strdup((AMime));
 delete Inst;
 return str;
}
 
char* Get_Application(char* MIME) {
 QString App="";
 KInstance *Inst = new KInstance("kdemime-test");
 KServiceTypeProfile::OfferList offers = KServiceTypeProfile::offers(MIME, "Application");
 KServiceTypeProfile::OfferList::ConstIterator it;
 
 for (it = offers.begin(); it != offers.end(); ++it) {
  App+=(*it).service()->name()+"\n";
 }
 char *str=strdup((App));
 delete Inst;
 return str;
}
 
}

Code: Alles auswählen

unit Unit1; 
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, dynlibs,
  StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 
 
  type
  TGetMIMEType = function (URL:Pchar):Pchar; cdecl;
  TGetApp = function (MIME:Pchar):Pchar; cdecl;
 
var
  Form1: TForm1; 
  LibHandle: TLibHandle;
  GetMIMEType:TGetMIMEType;
  GetApp:TGetApp;
 
  const   LIB_PATH = '/home/theo/kdevel/sharedl/src/libmime.so.1.0.0';
 
implementation
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Caption:=GetMIMEType(Pchar('/home/theo/touch.jpeg'));
  Memo1.text:=GetApp(Pchar(Caption));
end;
 
initialization
  {$I unit1.lrs}
 
  LibHandle:= LoadLibrary(LIB_PATH);
  GetMIMEType:= TGetMIMEType(GetProcAddress(LibHandle, 'Get_MIME_Type'));
  GetApp:= TGetApp(GetProcAddress(LibHandle, 'Get_Application'));
 
finalization
 
  if LibHandle <> NilHandle then
  begin
    FreeLibrary(LibHandle)
  end;
 
end.

hanibal
Beiträge: 369
Registriert: Sa 3. Mär 2007, 16:03
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Bramsche (Emsland)

Beitrag von hanibal »

wie muss ich den c code compilieren?

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Steht doch oben im C++ file drin (das auskommentierte).
Datei speichern als sharedl.cpp .
Vielleicht musst du noch den KDE Pfad anpassen oder mit $KDEDIR ersetzten.
Es muss natürlich alles notwendige installiert sein.
Bei mir ist einfach KDevelop installiert. Da müsste alles nötige mitkommen.

creed steiger
Beiträge: 958
Registriert: Mo 11. Sep 2006, 22:56

Beitrag von creed steiger »

Funktioniert excellent theo.
Danke für deine "Nachtschicht" ;)

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

creed steiger hat geschrieben: Danke für deine "Nachtschicht" ;)
Kein Problem. ;-)

Ich komme allerdings im Moment zeitlich nicht mehr dazu, das weiter auszufeilen.
Wenn du da was machen möchtest, kann ich dir kurz sagen, wo ich mir nicht sicher bin:

Kinstance: Das Ding braucht's. Es ersetzt quasi eine KApplication für nicht visuelle Programme.
Ob es allerdings optimal ist, das bei jedem Funktionsaufruf zu erzeugen, weiss ich nicht.

Dann bin ich mir nicht ganz sicher, ob der durch
char *str=strdup((App));
erezeugte Rückgabewert wieder freigegeben wird.

Dann könnte man nat. noch mehr Infos als den Namen abholen:
(*it).service()->exec()
(*it).service()->entryPath()
Oder den Service-Typ. Ich kenn mich da auch nicht aus.

Auch der Pascal Teil ist natürlich Wildsau-mässig. Man müsste mindestens noch das Libhandle checken before man die ProcAddress abholt.

Also wenn du Lust hast: der Code gehört dir (euch)

hanibal
Beiträge: 369
Registriert: Sa 3. Mär 2007, 16:03
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Bramsche (Emsland)

Re: Auslesen, welchr datei type mit welchem programm gestartet w

Beitrag von hanibal »

mit xdg-mine kann man unter gnome unt kde auslesen, welchen mime type ein file ht, und mi welchem prog das gestartet werden soll. und dann kann man das gaze damit auch noch ändern.

Antworten