Help binding over to C++

Chris Williams littleratblue at yahoo.co.jp
Thu Apr 2 23:51:23 PDT 2009


I'm trying to connect over to the C++ package called Awesomium (http://princeofcode.com/awesomium.php), which is decently small. I've created the files dawesome.h, dawesome.cpp, and dawesome.di, which you can see at the bottom of this post. Awesomium's library file was an import library, so I used coffimplib to convert it. I am using dmc to compile my files, using Digital Mars' stlport package.

But so when, at the end, I try to compile a full EXE on a test program (dawesome_test.d), I get some linker errors combining it with my bindings (dawesome.obj) and awesomium's converted library:

T:\programs\Dawesome>t:\dmd\windows\bin\dmd.exe dawesome_test.d dawesome.obj awesomium.lib
OPTLINK (R) for Win32  Release 8.00.1
Copyright (C) Digital Mars 1989-2004  All rights reserved.
dawesome.obj(dawesome)
 Error 42: Symbol Undefined ?loadURL at WebView@Awesomium@@QAEXABV?$basic_string at st
d at DV?$char_traits at std@D at 1@V?$allocator at std@D at 1@@std@ (void syscall Awesomium::We
bView::loadURL(basic_string<>::d::DV?$char_traits::std::D::WebView const &,alloc
ator<>::d::D::WebView ))
dawesome.obj(dawesome)
 Error 42: Symbol Undefined ?setCustomResponsePage at WebCore@Awesomium@@QAEXHABV?$
basic_string at std@DV?$char_traits at std@D at 1@V?$allocator at std@D at 1@@std@ (void syscal
l Awesomium::WebCore::setCustomResponsePage(int ,basic_string<>::d::DV?$char_tra
its::std::D::WebCore const &,allocator<>::d::D::WebCore ))
dawesome.obj(dawesome)
 Error 42: Symbol Undefined ?setBaseDirectory at WebCore@Awesomium@@QAEXABV?$basic_
string at std@DV?$char_traits at std@D at 1@V?$allocator at std@D at 1@@std@ (void syscall Awes
omium::WebCore::setBaseDirectory(basic_string<>::d::DV?$char_traits::std::D::Web
Core const &,allocator<>::d::D::WebCore ))
--- errorlevel 3

I'm very new to D and was always more a C guy than a C++ guy, so I'm really not sure where in the chain I might have gone wrong.

Here are my files:

dawesome.h
-----------------------------------------------
#ifndef __DAWESOME_H__
#define __DAWESOME_H__

extern "C" {

struct listen_funcs {
	void (*onBeginNavigation)(const char* url);
	void (*onBeginLoading)(const char* url, int statusCode, const wchar_t* mimeType);
	void (*onFinishLoading)();
	void (*onReceiveTitle)(const wchar_t* title);
	void (*onChangeTooltip)(const wchar_t* tooltip);
	void (*onChangeKeyboardFocus)(int isFocused);	
};

int dawesome_init(struct listen_funcs* l_funcs, const char* baseDir, int width, int height);
void dawesome_cleanup();

void dawesome_setCustomResponsePage(int statusCode, const char* filePath);
void dawesome_loadURL(const char* url);
void dawesome_loadHTML(const char* html);
void dawesome_loadFile(const char* path);

void dawesome_render(unsigned char* destination, int destRowSpan, int destDepth);
void dawesome_resize(int width, int height);

}

#endif
-----------------------------------------------


dawesome.cpp
-----------------------------------------------
#include "dawesome.h"
#include "WebCore.h"

#include <string>

using namespace Awesomium;

class MyListener : public WebViewListener {
private:
	struct listen_funcs* my_listener;
	
public:
	MyListener(struct listen_funcs* listener) {
		my_listener = listener;
	}
	
	void onBeginNavigation(const std::string& url) {
		if (my_listener->onBeginNavigation != NULL) {
			my_listener->onBeginNavigation(url.c_str());
		}
	}

	void onBeginLoading(const std::string& url, int statusCode, const std::wstring& mimeType) {
		if (my_listener->onBeginLoading != NULL) {
			my_listener->onBeginLoading(
				url.c_str(),
				statusCode,
				mimeType.c_str()
			);
		}
	}

	void onFinishLoading() {
		if (my_listener->onFinishLoading != NULL) {
			my_listener->onFinishLoading();
		}
	}

	void onCallback(const std::string& name, const Awesomium::JSArguments& args) {}
	
	void onReceiveTitle(const std::wstring& title) {
		if (my_listener->onReceiveTitle != NULL) {
			my_listener->onReceiveTitle(title.c_str());
		}
	}

	void onChangeTooltip(const std::wstring& tooltip) {
		if (my_listener->onChangeTooltip != NULL) {
			my_listener->onChangeTooltip(tooltip.c_str());
		}
	}

	void onChangeCursor(const HCURSOR& cursor) {}

	void onChangeKeyboardFocus(bool isFocused) {
		if (my_listener->onChangeKeyboardFocus != NULL) {
			my_listener->onChangeKeyboardFocus(
				isFocused ? 1 : 0
			);
		}
	}
};

//-------------
WebCore* core;
WebView* view;
MyListener* listener;

int dawesome_init(struct listen_funcs* l_funcs, const char* baseDir, int width, int height) {
	std::string str(baseDir);
	
	core = new WebCore(LOG_VERBOSE);
	core->setBaseDirectory(str);
	view = core->createWebView(width, height, false, true, 70);
	if (view == NULL) return 0;

	listener = new MyListener(l_funcs);
	view->setListener(listener);
	
	return 1;
}

void dawesome_cleanup() {
	view->destroy();
	delete core;
	delete listener;
}

void dawesome_setCustomResponsePage(int statusCode, const char* filePath) {
	std::string str(filePath);
	core->setCustomResponsePage(statusCode, str);
}

void dawesome_loadURL(const char* url) {
	std::string str(url);
	view->loadURL(str, "", "");
}

void dawesome_loadHTML(const char* html) {
	std::string str(html);
	view->loadURL(str);
}

void dawesome_loadFile(const char* path) {
	std::string str(path);
	view->loadURL(str);
}

void dawesome_render(unsigned char* destination, int destRowSpan, int destDepth) {
	view->render(destination, destRowSpan, destDepth, 0);
}

void dawesome_resize(int width, int height) {
	view->resize(width, height);
}
-----------------------------------------------

dawesome.di
-----------------------------------------------
extern (C) {

struct listen_funcs {
	void (*onBeginNavigation)(char* url);
	void (*onBeginLoading)(char* url, int statusCode, wchar* mimeType);
	void (*onFinishLoading)();
	void (*onReceiveTitle)(wchar* title);
	void (*onChangeTooltip)(wchar* tooltip);
	void (*onChangeKeyboardFocus)(int isFocused);	
}

int dawesome_init(listen_funcs* l_funcs, char* baseDir, int width, int height);
void dawesome_cleanup();

void dawesome_setCustomResponsePage(int statusCode, char* filePath);
void dawesome_loadURL(char* url);
void dawesome_loadHTML(char* html);
void dawesome_loadFile(char* path);

void dawesome_render(ubyte* destination, int destRowSpan, int destDepth);
void dawesome_resize(int width, int height);

}
-----------------------------------------------



More information about the Digitalmars-d mailing list