1

シンプルな API を使用する USB セキュリティ キーを使用しています。私がしなければならないことは、彼らのヘッダー ファイルをインクルードして呼び出しを行うことだけです。私は正常に動作するサンプル C プログラムを持っており、ほとんどこれを行います。

HINSTANCE hDll;
FARPROC dongle;
WORD retcode, handle[16], SD_p1, SD_p2, SD_p3, SD_p4;
DWORD lp1, lp2;
BYTE buffer [1024];
SD_p1 = 0x1C76; // example password 1
SD_p2 = 0x8078; // example password 2
SD_p3 = 0;
SD_p4 = 0;

hDll = GetModuleHandle("dongle.dll");

if (hDll == NULL)
{
    hDll = LoadLibrary("dongle.dll");
    if (hDll == NULL)
    {
        printf("Can't find dongle.dll\n");
        return;
    }
}

dongle = GetProcAddress(hDll, "dongle");

retcode = dongle(SD_FIND, &handle[0], &lp1, &lp2, &SD_p1, &SD_p2, &SD_p3, &SD_p4, buffer);

したがって、これですべてが正常に機能します。ドングルが検出され、後でドングルのさまざまな関数を呼び出すこともできます。ただし、これとまったく同じコードを、保護したい C++ アプリケーションにプラグインすると、次のエラーが発生します。

error C2197: 'int (__stdcall *)(void)' : too many actual parameters

これは retcode = dongle() 呼び出しで発生しています。サンプル アプリケーションではなく、アプリケーションにはパラメーターが多すぎるとコンパイラが判断する理由がわかりません。C と C++ でこのように GetProcAddress() を使用することの違いに関する記事を見つけましたが、これがここで見ている問題なのか、この特定のシナリオでその解決策をどのように適用するのかはわかりません.

私が知る必要があるのは、この C コードを C++ でコンパイルする方法です。

4

2 に答える 2

2

には、より適切な型定義を使用する必要がありますdongle

/* I didn't know what type SD_FIND was, assumed DWORD */
typedef WORD (CALLBACK *DONGLEPTR)(DWORD,WORD*,DWORD*,DWORD*
                                  ,WORD*,WORD*,WORD*,WORD*,BYTE*);

DONGLEPTR dongle; /* <-- need to change this type as well */

/* ... */

dongle = (DONGLEPTR)GetProcAddress(hDll, "dongle");

/* ... */
retcode = dongle(SD_FIND, ...);
于 2012-06-07T20:42:51.947 に答える
1

その記事はまさにあなたが抱えている問題です。C では、リストにパラメータがない関数定義は、任意の数のパラメータを取ることができる関数です。これは事実上、関数に渡すパラメーターの数と型をコンパイラーがチェックしないことを意味します。C++ では、コンパイラは関数に渡されるパラメーターの数と型を常にチェックします。そのため、関数呼び出しのパラメーターの正しい数と型で typedef を使用する必要があります。

次のようなものです:

typedef WORD (CALLBACK* DONGLEPROC)(DWORD, LPWORD, LPDWORD , LPDWORD , LPWORD, LPWORD, LPWORD, LPWORD, LPBYTE);
于 2012-06-07T20:43:58.760 に答える