MSVCRT.DLL の利用No.01271
ENCODINGSHIFTJIS さん 00/03/28 12:17
 

たまには、Cでも。 以下の様に sprintf を使えます。

------------ DLL1.C ----------------------
// 前には LibMain の定形ソース

 __declspec(dllexport) char* WINAPI MySub(char* format, int inint)
{
static char sz[99];
FARPROC sprintfproc;
  HINSTANCE hrt= LoadLibrary("MSVCRT.DLL");// EXIST ?
if( NULL == hrt )     return "MSVCRT.DLL load error !";
            sprintfproc = GetProcAddress( hrt, "sprintf");
if( NULL == sprintfproc ) return "sprintf ?";
            sprintfproc(sz,format,inint);
FreeLibrary( hrt );
return sz;
}

// Msvcrt.mac   --------------------------------------
loaddll "c:\\windows\\temp\\lcc\\dll1.dll";
if(!result){ menu "dll1.dll ??";endmacro }
                                         #a=99;
$a=dllfuncstr("MySub","%04d",#a);   // 0詰めで4桁固定
menu $a,str(#a);
freedll
endmacro

結果は 0099 を表示

Cコンパイラは フリーの Lcc-Win32 を使用(漢字はX)
BCC55のコマンドラインのフリー版はDLL作成のオプションが
わからなかった。

秀丸側からの呼び出しは何でも値らしい。sscanf はムリ。
可変引数でも型などは渡らないから上のように1引数ので使える。
16進は "%04x"

__END__

[ ]
RE:01271 MSVCRT.DLL の利用 BCC5.5No.01276
ENCODINGSHIFTJIS さん 00/03/29 16:20
 
C MAGAZINE のページ setbcc のところより コマンドラインオプションわかる。
 BCC5.5 は厳格に文法検査する!

15:52 C:\Borland\BCC55\Bin> bcc32 -WD -P-  \Windows\temp\dll1.c
Borland C++ 5.5 for Win32 Copyright (c) 1993, 2000 Borland
\Windows\temp\dll1.c:
警告 W8057 \Windows\temp\dll1.c 29: パラメータ 'hDLLInst' は一度も使用されない(
関数 LiblMain )
警告 W8057 \Windows\temp\dll1.c 29: パラメータ 'lpvReserved' は一度も使用されな
い(関数 LiblMain )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

/* -P- ??  Cコンパイルの指定をしてもC++コンパイル的厳格さ */
#include <windows.h>

char* WINAPI __declspec(dllexport) MySub(char* format,int inint)
{
static char sz[99];
    FARPROC sprintf ;
  HINSTANCE hrt= LoadLibrary("MSVCRT.DLL"); // EXIST ?
if( NULL == hrt )     return "MSVCRT.DLL load error !";
            sprintf = GetProcAddress( hrt, "sprintf");
if( NULL == sprintf ) return               "sprintf ?";
// 関数の typedef をしないとX。
((int(__cdecl *)(char*,char*,int)) sprintf)(sz,format,inint);
FreeLibrary( hrt );
return sz;
}

BOOL WINAPI __declspec(dllexport) LibMain(HINSTANCE hDLLInst, DWORD fdwReaso
n, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
        case DLL_PROCESS_DETACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
            break;
    }
    return TRUE;
}
// -------------------------------------------------
>__END__

[ ]