digitalmars.D.learn - Error execute MS function fputc()
- MGW (27/27) Jun 07 2015 Hi, everybody!
- Steven Schveighoffer (5/30) Jun 08 2015 DMD 32-bit does not use MSVC runtime, it uses DMC (Digital Mars C++
- MGW (40/40) Jun 08 2015 I found the solution. A problem in different structures of FILE
Hi, everybody!
DMD32 D Compiler v2.067.0
I try to cause the fputc function from CrtDLL.DLL and I receive a
mistake. Why?
import core.runtime; // Загрузка DLL Для Win
import std.stdio; // writeln
version(Windows) {
import std.c.windows.windows; // GetProcAddress для Windows
}
alias extern (C) int function(int, FILE*) t_fputc; t_fputc
ms_fputc;
int main(string[] args) {
version(Windows) { auto libCrtDll = "CrtDll.dll"; }
// Load CrtDLL.DLL MS Windows
auto h = Runtime.loadLibrary(libCrtDll);
// Find function fputc
ms_fputc = cast(t_fputc)GetProcAddress(h, "fputc");
import core.stdc.stdio: stdout;
try {
auto rez = ms_fputc('A' , core.stdc.stdio.stdout);
}
catch {
writeln("Error execute MS function fputc();");
}
return 0;
}
Jun 07 2015
On 6/7/15 12:41 PM, MGW wrote:
Hi, everybody!
DMD32 D Compiler v2.067.0
I try to cause the fputc function from CrtDLL.DLL and I receive a
mistake. Why?
import core.runtime; // Загрузка DLL Для Win
import std.stdio; // writeln
version(Windows) {
import std.c.windows.windows; // GetProcAddress для Windows
}
alias extern (C) int function(int, FILE*) t_fputc; t_fputc ms_fputc;
int main(string[] args) {
version(Windows) { auto libCrtDll = "CrtDll.dll"; }
// Load CrtDLL.DLL MS Windows
auto h = Runtime.loadLibrary(libCrtDll);
// Find function fputc
ms_fputc = cast(t_fputc)GetProcAddress(h, "fputc");
import core.stdc.stdio: stdout;
try {
auto rez = ms_fputc('A' , core.stdc.stdio.stdout);
}
catch {
writeln("Error execute MS function fputc();");
}
return 0;
}
DMD 32-bit does not use MSVC runtime, it uses DMC (Digital Mars C++
Compiler) runtime. So you cannot use MSVC versions of C runtime.
You can use Win32 system calls, though.
-Steve
Jun 08 2015
I found the solution. A problem in different structures of FILE
for MSVC and DMC. I take the pointer on structure of FILE from
CrtDLL.dll
Everything works!
// MGW 07.05.15
import core.runtime; // Загрузка DLL Для Win
import std.stdio; // writeln
version(Windows) {
import std.c.windows.windows; // GetProcAddress для Windows
}
alias extern (C) int function(int, FILE*) t_fputc;
t_fputc ms_fputc;
int main(string[] args) {
version(Windows) { auto libCrtDll = "CrtDll.dll"; }
// Load CrtDLL.DLL MS Windows
auto h = Runtime.loadLibrary(libCrtDll);
// Find function fputc
ms_fputc = cast(t_fputc)GetProcAddress(h, "fputc");
// Find array struct FILE MS
void* ubuf = cast(void*)GetProcAddress(h, "_iob");
import core.stdc.stdio: stdout;
try {
// stdout --> FILE dmc
auto rez = ms_fputc('A' , core.stdc.stdio.stdout);
}
catch {
writeln("Error execute MS function fputc();");
}
try {
// cast(FILE*)(ubuf + 0) ==> stdin MSVC
// cast(FILE*)(ubuf + 32) ==> stdout MSVC
// stdout --> FILE MSVC
auto rez = ms_fputc('B' , cast(FILE*)(ubuf + 32));
}
catch {
writeln("Error execute MS function ms_fputc();");
}
return 0;
}
Jun 08 2015








"MGW" <mgw yandex.ru>