dlang如何将C ++中的Magick ++类导入D中

时间:2017-04-20 18:30:57

标签: imagemagick d dllimport

如何在D中从库中导入类? 有什么我做错了吗?我已经成功地从dll到libs导入了函数,但从未成为类。

尝试从.lib导入一个类来获取这些错误:

public class WebViewRender : WebViewRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
    {
        base.OnElementChanged(e);
        if (Control != null)
        {
            var webView = Control as Android.Webkit.WebView;
            Dictionary<string, string> headers = new Dictionary<string, string>
            {
                ["Name"] = "value"
            };
            webView.SetWebViewClient(new MyWebViewClient());
            webView.LoadUrl(Control.Url, headers);
        }
    }
}
public class MyWebViewClient : WebViewClient
{
    public override bool ShouldOverrideUrlLoading(Android.Webkit.WebView view, string url)
    {
        Dictionary<string, string> headers = new Dictionary<string, string>
        {
            ["Name"] = "value"
        };
        view.LoadUrl(url, headers);
        return true;
    }
}

以下是我尝试导入类的方法,我认为这些是正确的定义,但可能是错误的:

main.obj : error LNK2019: unresolved external symbol "public: void __cdecl Magick::Image::write(char const *)" (?write@Image@Magick@@QEAAXPEBD@Z) referenced in function _Dmain
main.exe : fatal error LNK1120: 1 unresolved externals

这是我尝试在D中导入的功能:

pragma(lib, "library.lib");
extern (C++){
    Image createImage(const(char)*);
    void deleteImage(ref Image d);
}

pragma(lib, "C:/Program Files/ImageMagick-7.0.5-Q16/lib/CORE_RL_Magick++_.lib");
pragma(lib, "C:/Program Files/ImageMagick-7.0.5-Q16/lib/CORE_RL_MagickCore_.lib");
pragma(lib, "C:/Program Files/ImageMagick-7.0.5-Q16/lib/CORE_RL_MagickWand_.lib");
extern (C++,Magick){
    void InitializeMagick(const(char)*);
    //void InitializeMagick(const(char)* __ptr64);
    class Image{
        //There are errors trying to import any constructor or function
        //this();
        //this(const(char)*);
        final void write(const(char)*);
    }
}

int main(string[] args){
    Magick.InitializeMagick("");
    Magick.Image img = createImage("screenshot:");
    img.write("file.jpg"); //linking problems after adding this line
    return 0;
}

1 个答案:

答案 0 :(得分:1)

write的构造函数和Image方法都采用std :: string而不是char*。您未收到来自createImage的投诉,因为它会将char*转换为std::string,但您会收到来自Image.write的投诉,因为D编译器无法转换{{1}转到char*
您需要向d编译器讲授std::string并围绕std::string制作包装器,方法与std::string相同。
如果你在堆上的cpp端创建Magick::Image并且只传递一个指针,那么你可以在没有太多样板的情况下使用它。这是一个例子:

std::string
// wrapper.cpp
#include <Magick++.h>
#include <string>

Magick::Image* createImage(const std::string &imageSpec_)
{
    return new Magick::Image(imageSpec_);
}

void deleteImage(Magick::Image *&image)
{
    delete image;
    image = NULL;
}

std::string* createCppString(const char *s)
{
    return new std::string(s);
}

void deleteCppString(std::string *&sp)
{
    delete sp;
    sp = NULL;
}

但是如果你想在堆栈上创建// imm.d pragma(lib, "wrapper.lib"); extern (C++, std) { // std::string boilerplate struct allocator(T); struct char_traits(CharT); struct basic_string(CharT, Traits=char_traits!CharT, Allocator=allocator!CharT); alias string = basic_string!char; } pragma(lib, "C:/Program Files/ImageMagick-7.0.5-Q16/lib/CORE_RL_Magick++_.lib"); pragma(lib, "C:/Program Files/ImageMagick-7.0.5-Q16/lib/CORE_RL_MagickCore_.lib"); pragma(lib, "C:/Program Files/ImageMagick-7.0.5-Q16/lib/CORE_RL_MagickWand_.lib");extern (C++, Magick) { void InitializeMagick(const(char)*); class Image { @disable this(); final void write(ref const(std.string)); } } extern (C++) { Magick.Image createImage(ref const(std.string)); void deleteImage(ref Magick.Image); std.string* createCppString(const(char)*); void deleteCppString(ref std.string*); } void main() { Magick.InitializeMagick(""); auto imgsrc = "screenshot:".createCppString; scope(exit) deleteCppString(imgsrc); Magick.Image img = createImage(*imgsrc); scope(exit) deleteImage(img); auto filename = "file.jpg".createCppString; scope(exit) deleteCppString(filename); img.write(*filename); } (在cpp一侧)并通过vale传递它而不是绕过指针你需要更多的锅炉板,你需要填写std::string

base_string

这是做到这一点的最佳方式,但祝你好运(struct basic_string(CharT, Traits=char_traits!CharT, Allocator=allocator!CharT); { // fill in the fields ... } 不是很友好),但你可以让工具为你做一些艰苦的工作,例如htod