9

Win CE を実行している ICOP VDX-6354 ボードがあります。C# プログラムからボードのブザーを制御しようとしています。私はすべてのplaysoundなど「coredll.dll」プラットフォームが呼び出すことを試しました。それらのどれもこれまでに機能しませんでした。したがって、私の最後のチャンスは、独自の DLL を作成することです。

unsigned char inp(short addr)
{
    unsigned char cValue;
    _asm
    {
        mov dx, addr
        in ax, dx
        mov cValue, al
    }
    return cValue;
}
void outp(int addr, unsigned char val)
{
     __asm
    {
        push edx
        mov edx, DWORD PTR addr
        mov al, BYTE PTR val
        out dx, al
        pop edx
    }
}
bool MyBeep(DWORD dwFreq, DWORD dwDuration)
{
    outp(0x43, 0xb6); // Set Buzzer
    outp(0x42, (0x1234dc / dwFreq)); // Frequency LSB
    outp(0x42, (0x1234dc / dwFreq) >> 8); // Frequency MSB
    outp(0x61, inp(0x61) | 0x3); // Start beep
    Sleep(dwDuration);
    outp(0x61, inp(0x61) & 0xfc); // End beep
    return TRUE;
}

上記のコードは、ボードのデータシートで入手できます。それをDLLとしてコンパイルしてから、C#プログラムで次のように呼び出したい

[DllImport("Buzzer.dll", EntryPoint = "MyBeep")]
public static extern void MyBeep(uint dwFreq, uint dwDuration);

コンパイル時に次のようにプレフィックスを使用しました。

extern "C" __declspec(dllexport) bool MyBeep(DWORD dwFreq, DWORD dwDuration)

うまくいけば、ブザーを制御できるようになります。私の問題は、コンパイルに失敗したことです。ここの手順に従いましたが、役に立ちませんでした。

段階的に何をすべきですか?

編集:

DLLをビルドしたと思います。ここで見つかった DLL をビルドする別の方法を試しました。

ここで、DLL を C# スタートアップ プロジェクトの Debug フォルダーにコピーしました (プロジェクトの他の DLL もこのフォルダーにあります)。次に、C# プロジェクトで MyBeep.DLL から MyBeep 関数を呼び出そうとします。

[DllImport("MyBeep.dll", EntryPoint = "MyBeep")]
public static extern bool MyBeep(UInt32 dwFreq, UInt32 dwDuration);

ただし、次の例外があります。

PInvoke DLL 'MyBeep.dll' が見つかりません。

何か不足していますか?上記のリンクをチェックして、これまでに行ったことを理解するために DLL をビルドするためにごまかしたことを確認してください。よろしく。

4

2 に答える 2

1

あなたが持っている2つの問題があります:

  1. dll をビルドしてデバッグする必要はありません。C# プロジェクトと同じプロジェクトにある場合は、C# プロジェクトをスタートアップ プロジェクトとして設定します (プロジェクト ファイルを右クリックします)。そうでない場合は、[デバッグの開始] ではなく [ビルド] を選択するだけです (ショートカットを使用している場合)。これはおそらく Ctrl+Shift+B [C# 環境セットアップを使用している場合] または F7 [C++ 環境セットアップを使用している場合] になります)。

  2. DLL を適切な場所に配置する必要があります。これを自動化したい場合は、ビルド後のステップを C++ プロジェクトに追加するだけです (プロジェクト プロパティ、私の記憶が正しければビルド アクション、およびビルド後)。copy "$(TargetPath)" "$(SolutionDir)\CsProj\bin\$(ConfigurationName)\*.*"

これらのマクロのいくつかは少しずれているかもしれませんが、一般的な考え方は理解できるはずです。

編集: C# プロジェクトの前に C++ プロジェクトがビルドされていることも確認する必要があります。C# プロジェクト ファイルを右クリックし、[プロジェクトの依存関係] に移動して、[依存先] ボックスで C++ ライブラリにチェックマークを付けます。ビルド後の手順が機能していることを確認するには、C++ プロジェクトを単独でビルドし、DLL が C# プロジェクトの正しいディレクトリにコピーされていることを確認してください。そうでない場合は、出力ウィンドウにエラーのフラグが立てられます。そのチュートリアルに従って DLL を作成した場合は、問題ありません。

于 2011-10-28T10:57:37.360 に答える
0

エラー メッセージは別のことを示唆していますが、エクスポートされた関数の名前を確認する必要があります。Win32 の場合、私は常にこのツールを使用します。CE dll の場合、おそらくDUMPBIN /EXPORTSが機能します。

関数名は呼び出される可能性があります__MyBeep: このプレフィックスは C の慣例だと思います。

于 2012-01-22T21:02:06.053 に答える