go语言编译 dll
SET CGO_ENABLED=1
go build -ldflags "-w -s" -o searchEngine.dll -buildmode=c-shared shared.go
func Init(ppath string) {
mu.Lock()
defer mu.Unlock()
change = true
loadPath = ppath
}
func RemoveIndex() {
mu.Lock()
defer mu.Unlock()
index.DestroyAndRemoveIndexFiles()
}
func Search(key string, typed int) *C.char {
lazyLoad()
mu.RLock()
defer mu.RUnlock()
if loadPath == "" {
return C.CString("@NullLoadPath")
}
res := index.Search(key, typed)
if res == nil {
return C.CString("@Empty")
}
var ok []string
for _, v := range res {
ok = append(ok, v.ID)
}
bs, _ := json.Marshal(ok)
return C.CString(string(bs))
}
cpp 调用 dll
#include<iostream>
#include <windows.h>
#line 1 "cgo-builtin-export-prolog"
#include <stddef.h>
#ifndef GO_CGO_EXPORT_PROLOGUE_H
#define GO_CGO_EXPORT_PROLOGUE_H
#ifndef GO_CGO_GOSTRING_TYPEDEF
typedef struct { const char *p; ptrdiff_t n; } _GoString_;
#endif
#endif
#line 1 "cgo-gcc-export-header-prolog"
#ifndef GO_CGO_PROLOGUE_H
#define GO_CGO_PROLOGUE_H
typedef signed char GoInt8;
typedef unsigned char GoUint8;
typedef short GoInt16;
typedef unsigned short GoUint16;
typedef int GoInt32;
typedef unsigned int GoUint32;
typedef long long GoInt64;
typedef unsigned long long GoUint64;
typedef GoInt64 GoInt;
typedef GoUint64 GoUint;
typedef __SIZE_TYPE__ GoUintptr;
typedef float GoFloat32;
typedef double GoFloat64;
typedef float _Complex GoComplex64;
typedef double _Complex GoComplex128;
typedef char _check_for_64_bit_pointer_matching_GoInt[sizeof(void*)==64/8 ? 1:-1];
#ifndef GO_CGO_GOSTRING_TYPEDEF
typedef _GoString_ GoString;
#endif
typedef void *GoMap;
typedef void *GoChan;
typedef struct { void *t; void *v; } GoInterface;
typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;
#endif
#ifdef __cplusplus
extern "C" {
#endif
extern __declspec(dllexport) void Init(GoString ppath);
extern __declspec(dllexport) void RemoveIndex();
extern __declspec(dllexport) char* Search(GoString key, GoInt typed);
#ifdef __cplusplus
}
#endif
HINSTANCE dllHandle = NULL;
bool isLoaded = false;
HINSTANCE init_dll() {
if(dllHandle) {
return dllHandle;
}
dllHandle = LoadLibrary("searchEngine.dll");
return dllHandle;
}
void removeIndex() {
auto handle = init_dll();
typedef void (*InitFunc)();
auto func = (InitFunc)GetProcAddress(handle, "RemoveIndex");
if(func) {
func();
printf("\nfree index\n");
}
}
char* search(const char* p) {
typedef char* (*Func)(GoString,int);
auto handle = init_dll();
if(!isLoaded) {
typedef void (*InitFunc)(GoString);
auto func = (InitFunc)GetProcAddress(handle, "Init");
if(!func) {
printf("error no func\n");
return NULL;
}
GoString s;
s.p = "D:/ASUS/Desktop/plug/quickcodesearch";
s.n = strlen(s.p);
func(s);
printf("in-> %s\n",s.p);
isLoaded = true;
}
Func ffunc = (Func)GetProcAddress(handle,"Search");
GoString buf;
buf.p = p;
buf.n = (unsigned long long)strlen(p);
return ffunc(buf,0);
}
int main(void) {
char* p = search("go");
printf("debug [%s]",p);
free(p);
removeIndex();
FreeLibrary(dllHandle);
return 0;
}