История изменений
Исправление mittorn, (текущая версия) :
У меня «как есть» не заработало, но заработала такая конструкция:
Виндовое приложение:
/usr/lib/mingw64-toolchain/bin/x86_64-w64-mingw32-gcc wine-wrap.c -o wine-wrap.exe -mconsole
#include <stdio.h>
#include <windows.h>
int main(int argc, char **argv)
{
printf("winegcc test\n");
void *dll = LoadLibraryA("wine-wrap.dll.so");
printf("dll %x\n", dll);
int (*wrap)(const char*) = (void*)GetProcAddress(dll, "wrap");
int r = wrap(argv[1]);
printf("ret %d\n", r);
return r;
}
Линуксовая dll:
gcc wine-wrap2.c -c -fPIC
#include <stdlib.h>
#include <stdio.h>
int unix_wrap(char *arg)
{
printf("unix_wrap %s\n", arg);
return system(arg);
}
winegcc wine-wrap3.c wine-wrap2.o -o wine-wrap.dll wine-wrap3.dll.spec -shared
wine-wrap3.dll.spec
@ cdecl -arch=x86_64 wrap(ptr) wrap
wine-wrap3.c
#include <windef.h>
#include <stdio.h>
BOOL WINAPI DllMain(INT par1, INT par2)
{
printf("Here is DllMain, par1=%d, par2=%d\n", par1, par2);
return TRUE;
}
extern int unix_wrap(char *arg);
int WINAPI wrap(char *arg)
{
printf("wrap %s", arg);
return unix_wrap(arg);
}
Вызов exe из консоли дожидается дочернего процесса и возвращает его результат.
stdout не перехватывается - тут скорее всего понадобится процесс-прокси делать, копирующий между юниксовым и виндовым пайпом
Исходная версия mittorn, :
У меня «как есть» не заработало, но заработала такая конструкция:
Виндовое приложение:
/usr/lib/mingw64-toolchain/bin/x86_64-w64-mingw32-gcc wine-wrap.c -o wine-wrap.exe -mconsole
#include <stdio.h>
#include <windows.h>
int main(int argc, char **argv)
{
printf("winegcc test\n");
void *dll = LoadLibraryA("wine-wrap.dll.so");
printf("dll %x\n", dll);
int (*wrap)(const char*) = (void*)GetProcAddress(dll, "wrap");
int r = wrap(argv[1]);
printf("ret %d\n", r);
return r;
}
Линуксовая dll:
gcc wine-wrap2.c -c -fPIC
#include <stdlib.h>
#include <stdio.h>
int unix_wrap(char *arg)
{
printf("unix_wrap %s\n", arg);
return system(arg);
}
winegcc wine-wrap3.c wine-wrap2.o -o wine-wrap.dll wine-wrap3.dll.spec -shared
wine-wrap3.dll.spec
@ cdecl -arch=x86_64 wrap(ptr) wrap
wine-wrap3.c
#include <windef.h>
#include <stdio.h>
BOOL WINAPI DllMain(INT par1, INT par2)
{
printf("Here is DllMain, par1=%d, par2=%d\n", par1, par2);
return TRUE;
}
extern int unix_wrap(char *arg);
int WINAPI wrap(char *arg)
{
printf("wrap %s", arg);
return unix_wrap(arg);
}
Вызов exe из консоли дожидается дочернего процесса и возвращает его результат