How can i use a c++ compiled dll on c#?

Posted on 2008-10-13
Last Modified: 2013-11-20

Ive compiled a dll and i need it to use on c#, how can i do that?

Im ataching dll code.

#include "stdafx.h" // Required Precompiled Header

#include "unknwn.h" // IUnknown Interface

#include "Exdisp.h" // IWebBrowser2 Interface

#include "stdlib.h" // x

#include "mshtml.h" // MSHTML

BOOL APIENTRY getFrameDocumentById( HANDLE hModule,

DWORD ul_reason_for_call,

LPVOID lpReserved)


return TRUE;


extern "C" __declspec(dllexport) HRESULT CALLBACK GetFrameDocuments(long cbAddress,

IWebBrowser2* pTopWebBrowser) {


// ----- Initialize Variables ---


int code = 0;

HRESULT hr = 0;

UINT i = 0;

// Validate WebBrowser Argument (!NULL, top win, !busy, etc.)

if (pTopWebBrowser != NULL) {

// Get pTopWebBrowser's Document IDispatch Interface

code = 1;

IDispatch* pTopDocument;

hr = pTopWebBrowser->get_Document(&pTopDocument);

if (pTopDocument != NULL) {

// Get pTopDocument's Container OLE Interface

code = 2;

IOleContainer* pContainer;

hr = pTopDocument->QueryInterface(IID_IOleContainer, (void**)&pContainer);


if (SUCCEEDED(hr)) {

// Get Container's Embeddings Enumerator

code = 3;

IEnumUnknown* pEnumerator;

hr = pContainer->EnumObjects(OLECONTF_EMBEDDINGS, &pEnumerator);


if (SUCCEEDED(hr)) {

// Iterate Container's Embeddings

IUnknown* pUnk;

ULONG uFetched;

for (i = 0; S_OK == pEnumerator->Next(1, &pUnk, &uFetched); i++) {

// Get Embedded's IWebBrowser2 Interface

code = 4;

IWebBrowser2* pFrameWebBrowser;

hr = pUnk->QueryInterface(IID_IWebBrowser2, (void**)&pFrameWebBrowser);

if (SUCCEEDED(hr)) {

// Get Embedded's IHTMLElement Interface

code = 5;

IHTMLElement* pFrameIHTMLElement;

hr = pUnk->QueryInterface(IID_IHTMLElement, (void**)&pFrameIHTMLElement);


if (SUCCEEDED(hr)) {

// Get IHTMLElement's Document IDispatch Interface

code = 6;

IDispatch* pFrameDocument;



if (pFrameDocument != NULL ) {

// Get Frame's Docuument IDispatch Interface

code = 7;

IHTMLDocument2* pFrameIHTMLDocument2;

hr = pFrameDocument->QueryInterface(IID_IHTMLDocument2, (void**)&pFrameIHTMLDocument2);


if (SUCCEEDED(hr)) {

typedef void (__stdcall *FUNCPTR)(

IWebBrowser2 *pWebBrowser,

IHTMLDocument2 *pFrameDocument,

BSTR pbstr);

FUNCPTR vbFunc = (FUNCPTR)cbAddress;

wchar_t wchar[] = L"Test string";

vbFunc(pTopWebBrowser, pFrameIHTMLDocument2, SysAllocString(wchar));


} // pFrameIHTMLDocument2

} // pFrameDocument

} // pFrameIHTMLElement

} // pFrameWebBrowser


} // for pEnumerator

} // pEnumerator


} // pContainer

} // pTopDocument

} // Vaidate pTopWebBrowser

//return 0;

if (hr == 0) {

return i + 9900; // testing


else {

return code + 8800;


} // GetFrameWindows

Def File:

; Cross.def : Declares the module parameters for the DLL.

LIBRARY      "Cross"


    ; Explicit exports can go here

	GetFrameDocuments @1

Open in new window

Question by:epagos7

Accepted Solution

Misbah earned 500 total points
ID: 22705509
you need to declear the functions/methods you made in cpp in a c# class
and then you can use this c# class (wrapper for cpp) as any normal c# class.

see this example:

Author Comment

ID: 22705637

any help how can i declare and use the c++ func:

extern "C" __declspec(dllexport) HRESULT CALLBACK GetFrameDocuments(long cbAddress,
IWebBrowser2* pTopWebBrowser) {


Also i do not have HResult type on c#
LVL 19

Expert Comment

ID: 22706598
System.Long should correspond to HRESULT, I am however not quite certain regarding the IWebBrowser2 interface however this thread might be helpful

Featured Post

IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

Calculating holidays and working days is a function that is often needed yet it is not one found within the Framework. This article presents one approach to building a working-day calculator for use in .NET.
Container Orchestration platforms empower organizations to scale their apps at an exceptional rate. This is the reason numerous innovation-driven companies are moving apps to an appropriated datacenter wide platform that empowers them to scale at a …
The viewer will learn how to pass data into a function in C++. This is one step further in using functions. Instead of only printing text onto the console, the function will be able to perform calculations with argumentents given by the user.
The viewer will learn additional member functions of the vector class. Specifically, the capacity and swap member functions will be introduced.

747 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

16 Experts available now in Live!

Get 1:1 Help Now