0

I have application for Windows Mobile 6. To build it I use cegcc (arm-mingw32ce). Now I have new device with new SDK and some functions from this SDK must be added to this application. Here comes SDK.

header.h

#ifndef _HEADER_H_
#define _HEADER_H_

#include <windows.h>

#ifndef _SOME_FLAG_
extern "C"
{
#endif

BOOL foo(DWORD *lpdwParam1, DWORD *lpdwParam2);

#ifndef _SOME_FLAG_
}
#endif

#endif  

library.lib (this is probably import library compiled with VC++, there is library.dll on device)

Some output from "dumpbin /all library.lib"

2DA0 ?foo@@YAHPAK0@Z
2DA0 __imp_?foo@@YAHPAK0@Z

Archive member name at 2DA0: library.dll/
correct header end
Version      : 0
Machine      : 1C2 (Thumb)
SizeOfData   : 0000002B
DLL name     : library.dll
Symbol name  : ?foo@@YAHPAK0@Z (int __cdecl foo(unsigned long *,unsigned long *))
Type         : code
Name type    : undecorate
Hint         : 14
Name         : foo

I'm able to use this SDK in VS2k5 (installation of Windows Mobile SDK was needed...) but compiling with cegcc fail.

I was trying to compile and link it as C and Cpp. With and without _SOME_FLAG_ defined (C compilation with this flag set fail on extern "C" of course).

The results are:

undefined reference to `foo'

when C compiled or Cpp compiled with extern "C" and

undefined reference to `foo(unsigned long*, unsigned long*)'

when Cpp compiled without extern "C".

Compile:

gcc -O2 -Wall -Wextra -pedantic -Wno-long-long -g -c -DUNICODE -D_UNICODE -Ic:\inc sample.c

Linking:

gcc -static -mconsole -o sample obj\sample.o -lc:\lib\library.lib -laygshell

When I Cpp compile I'm only changing sample.c to sample.cpp (there is only main with simple foo call).

It look like there is a mangling problem (vc++ vs gcc). I've tried to add __attribute__((dllimport)) and __attribute__((cdecl))

How can I solve this problem? Any ideas?

zakrzak
  • 543
  • 1
  • 4
  • 7

1 Answers1

0

Problem solved. I've forget about possibility of run-time dynamic linking

#include <windows.h>
#include <winbase.h>
#include <header.h>

HINSTANCE dllinst = NULL;
typedef BOOL (CALLBACK LP_FOO)(DWORD *lpdwParam1, DWORD *lpdwParam2);
static LP_FOO Foo;

dllinst = LoadLibrary("library.dll");
Foo = (LP_FOO) GetProcAddress((HMODULE) dllinst, "foo");

Now I can use Foo same as foo.

zakrzak
  • 543
  • 1
  • 4
  • 7