Hmm, ob es wohl am einfachsten wäre, ein shared object in C++ mit einem C Interface zu basteln um da ranzukommen?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
Auslesen, welchr datei type mit welchem programm gestartet w
-
- Beiträge: 958
- Registriert: Mo 11. Sep 2006, 22:56
Sichertheo hat geschrieben:[
Hmm, ob es wohl am einfachsten wäre, ein shared object in C++ mit einem C Interface zu basteln um da ranzukommen?
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;
Vielleicht hilft ja diese Seite weiter: http://wiki.lazarus.freepascal.org/H2Pas" onclick="window.open(this.href);return false;mit einem C Interface zu basteln
knight
-
- Beiträge: 958
- Registriert: Mo 11. Sep 2006, 22:56
http://free-programming-ebooks.blogspot ... ascal.html" onclick="window.open(this.href);return false;
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.
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.
-
- Beiträge: 958
- Registriert: Mo 11. Sep 2006, 22:56
Kein Problem.creed steiger hat geschrieben: Danke für deine "Nachtschicht"

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)
-
- 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
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.