link from a dll to another function in another dll?
maarten van damme
maartenvd1994 at gmail.com
Sun May 1 11:00:34 PDT 2011
Great, now the error in kernel32.def is resolved but it gets the same
problem in kernel33.def.
here is the start of the exports from kernel33.def:
EXPORTS
_hread @1334
how can I change this to resolve that?
2011/5/1 Rainer Schuetze <r.sagitario at gmx.de>
> It seems you have hit another of those dreaded optlink bugs.
>
> With less symbols, it works if you declare the imports like this (because
> of the described name mangling):
>
> IMPORTS
> _imported_hread at 0 = kernel33._hread
>
> 2 more notes:
> - you don't need to import kernel33.di
> - you should not use "SINGLE" in the DATA statement of the def file, it
> will share the memory across processes.
>
>
>
> maarten van damme wrote:
>
>> Number overflow?
>> So I implemented the suggested changes (you can check them out at
>> http://dl.dropbox.com/u/15024434/version2.zip)
>>
>> But now I get when I compile it : "kernel32.def(738) : Error 12: Number
>> Overflow: (strange symbol over here)"
>>
>> I do agree I should've picked a simpler example but I think the
>> statisfaction will be even bigger if I were to succeed :p
>>
>> 2011/5/1 maarten van damme <maartenvd1994 at gmail.com <mailto:
>> maartenvd1994 at gmail.com>>
>>
>>
>> Wow, thanks for the help
>> The first thing I did was in the .di file adding extern(windows){ ... }
>> and now compiling doesn't give errors and when examining with dllexp
>> I can see that it exports the same functions as the real kernel32.dll
>> :D
>>
>> Now I'm going to implement all other suggested changes, thanks a lot
>>
>>
>> 2011/4/30 Rainer Schuetze <r.sagitario at gmx.de
>> <mailto:r.sagitario at gmx.de>>
>>
>>
>> I'm not sure your wrapping will work with kernel32.dll, but in
>> general here are a few tips:
>>
>> - most functions in the windows API use the __stdcall calling
>> convention in C/C++, which translates to D as "extern(Windows)"
>>
>> - this will usually add the number of bytes passed on the stack
>> as a "@NN" postfix to the function name. This postfix does not
>> exist in kernel32.dll, but in the import library kernel32.lib
>> that you find in the dmd lib folder. Maybe you can use the
>> standard import library, or use the translation shown below.
>>
>> - as the exported function and the function you want to chain to
>> have identical names, you have to change at least one of these
>> and modify them in some build step. I'd suggest to do this in
>> the def file:
>>
>> The symbols in the d-source file containing:
>>
>> ----
>> extern(Windows) HANDLE imported_GetCurrentProcess();
>>
>> export extern(Windows) HANDLE internal_GetCurrentProcess()
>> {
>> return imported_GetCurrentProcess();
>> }
>> ----
>>
>> can be mapped to other symbols in the def file:
>>
>> ----
>> EXPORTS
>> GetCurrentProcess = internal_GetCurrentProcess
>>
>> IMPORTS
>> imported_GetCurrentProcess = kernel33.GetCurrentProcess
>> ----
>>
>> - if you don't know the number of arguments, you should not call
>> the wrapped function, as this will change the callstack.
>> Instead, you should just jump to it:
>>
>> void internal_hread()
>> {
>> asm
>> {
>> naked;
>> jmp imported_hread;
>> }
>> }
>>
>> I haven't tried all that, though, so there might be some
>> mistakes...
>>
>> Rainer
>>
>>
>>
>> Denis Koroskin wrote:
>>
>> On Sat, 30 Apr 2011 13:47:53 +0400, maarten van damme
>> <maartenvd1994 at gmail.com <mailto:maartenvd1994 at gmail.com>>
>>
>> wrote:
>>
>> I've changed this, I think I'm still kinda confused with
>> lib files. They've
>> told me you can't do something with them without a .di file
>> So I went ahead and made a kernel33.di file. I now
>> import it in kernel32.d
>> and my declaration is
>> System(C){
>> export void * exportedfunctionblablabal(){
>> return exportedfunctionblablablal();
>> }
>> ....
>> }
>>
>> The file in the directory are:
>> kernel32.d : http://dl.dropbox.com/u/15024434/d/kernel32.d
>> kernel33.di :
>> http://dl.dropbox.com/u/15024434/d/kernel33.di
>> kernel33.lib :
>> http://dl.dropbox.com/u/15024434/d/kernel33.lib
>> kernel33.dll :
>> http://dl.dropbox.com/u/15024434/d/kernel33.dll
>>
>> I've tried to compile using dmd -d kernel32.d
>> kernel33.di kernel33.lib but
>> it throws errors like
>> "Error 42: Symbol undifined _Dkernel1336_hreadfzpV"
>> I have literally no clue why this is the case, can
>> someone help me out or
>> look at the files?
>>
>> 2011/4/27 maarten van damme <maartenvd1994 at gmail.com
>> <mailto:maartenvd1994 at gmail.com>>
>>
>>
>> I'm afraid I've been a little unclear.
>> I've copied kernel32.dll from the windows dir,
>> renamed it to kernel33.dll
>> and generated a .lib from it using implib.
>> Then I've created a d file with a correct
>> dllmain(stolen from examples) and
>> between
>>
>> system(C){
>> export void * exportedfunctionfromkernel33.dll();
>> export void * exportedfunction2fromkernel33.dll();
>> ....
>> }
>>
>> But it looks like you can't both declare a function
>> from another lib and
>> export it at the same time.
>>
>>
>> In your kernel33.di, try making it extern (C) export void*
>> _hread(); etc. You functions get D mangling otherwise.
>>
>> I'd also suggest you to start with a less complex example,
>> e.g. export only one function, make sure it works, then add
>> the rest.
>>
>> If you think your .lib files doesn't do its job, try using
>> .def file instead. I find them extremely helpful, and they
>> are a lot easier to edit/extend.
>>
>> Hope that helps.
>>
>>
>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/digitalmars-d/attachments/20110501/8372527c/attachment-0001.html>
More information about the Digitalmars-d
mailing list