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