2015-01-15 69 views
0

我试图编译我的web应用程序的不过我有一点麻烦抓住了文件的路径在C用C抓取文件路径+ WebkitGTK

在PyGTK的我在C.本地桌面应用程序将使用...

import webkit, pygtk, gtk, os 

path=os.getcwd() 
print path 
web_view.open("file://" + path + "/index.html") 

但是我不知道如果我只是找错了地方或者什么,但是当我搜索谷歌我一直无法找出如何抓住文件在C中我想用这样的路径。

gchar* uri = (gchar*) (argc > 1 ? argv[1] : "file://" + path + "app/index.html"); 

而是在像这样一个怪诞的方式链接到它的...

gchar* uri = (gchar*) (argc > 1 ? argv[1] : "file://" + /home/michael/Desktop/kodeWeave/linux/app/index.html"); 
webkit_web_view_open (web_view, uri); 

这里是我的整个项目(如果有用)。

#include <stdio.h> 
#include <string.h> 
#include <gtk/gtk.h> 
#include <webkit/webkit.h> 

static WebKitWebView* web_view; 

void on_window_destroy (GtkObject *object, gpointer user_data) { 
    gtk_main_quit(); 
} 

int main (int argc, char *argv[]) { 
    GtkBuilder *builder; 
    GtkWidget *window; 
    GtkWidget *scrolled_window; 

    gtk_init(&argc, &argv); 

    builder = gtk_builder_new(); 
    gtk_builder_add_from_file (builder, "browser.xml", NULL); 
    window = GTK_WIDGET (gtk_builder_get_object (builder, "window1")); 
    scrolled_window = GTK_WIDGET (gtk_builder_get_object (builder, "scrolledwindow1")); 
    g_signal_connect (G_OBJECT (window), "delete-event", gtk_main_quit, NULL); 

    gtk_window_set_title(GTK_WINDOW(window), "kodeWeave"); 

    web_view = WEBKIT_WEB_VIEW (webkit_web_view_new()); 
    gtk_container_add (GTK_CONTAINER (scrolled_window), GTK_WIDGET (web_view)); 

    gtk_builder_connect_signals (builder, NULL); 

    g_object_unref (G_OBJECT (builder)); 

    gchar* uri = (gchar*) (argc > 1 ? argv[1] : "file:///home/michael/Desktop/kodeWeave/linux/app/index.html"); 
    webkit_web_view_open (web_view, uri); 

    gtk_widget_grab_focus (GTK_WIDGET (web_view)); 
    gtk_widget_show_all (window); 

    gtk_main(); 

    return 0; 
} 

回答

1

您不能使用+运算符来连接在C字符串,您可能需要snprintf代替,首先你需要一个足够大的缓冲区,可能是恒定的PATH_MAX将工作,它在limits.h定义,所以对于例如

char uri[PATH_MAX]; 
char cwd[PATH_MAX]; 

getcwd(cwd, sizeof(cwd)); 

if (argc > 1) 
    snprintf(uri, sizeof(uri), "%s", argv[1]); 
else 
    snprintf(uri, sizeof(uri), "file://%s/index.html", cwd); 
    /*        ^%s specifier for^this char pointer */ 

+运营商与您的操作数,但以不同的方式,它只是执行指针运算,因为操作数的指针。

+0

有没有围绕主要路径?如果我移动文件夹,重命名目录或在另一台具有不同用户名的计算机上使用,该怎么办?我不希望它依赖于特定的位置。 – 2015-01-15 18:22:25

+3

由于这是一个GTK +程序,并且GTK +使用GLib,[GLib有一堆字符串助手](https://developer.gnome.org/glib/unstable/glib-String-Utility-Functions.html),可避免需要一个静态的,固定大小的缓冲区(注意在完成时你必须在运行时释放内存)[以及比简单字符串连接更适合构建URL的函数](https://developer.gnome.org/油嘴/不稳定/油嘴-URI-Functions.html)。 – andlabs 2015-01-15 18:32:39

+1

@andlabs不错的链接,这非常有趣。但我相信OP会与这些函数混淆,因为显然OP不明白c中的字符串是如何可能的以及如何处理它们。 – 2015-01-15 18:34:54