0

私はdllを操作し、さまざまなファイルをリンクするのが非常に初心者です。

main() 関数と他のすべてを同じ .c ファイルに書き込んで実行することを知っています。

パターンマッチングに役立つプログラムが1つあります。文字列を取得し、テキスト文字列全体に存在するかどうかを確認します。お気に入り

テキスト文字列: 私の名前はジョンです

照合する文字列: 名前

答え: はい

主な機能は次のとおりです。

int main(int argc, const char *argv[])
{
    char target[200];
    char *ch = target;
    char pattern[20];
    int i,k,count,l;
    printf("\nEnter the string: \n");
    fgets(target,100,stdin);
    printf("Enter the string to be matched: \n");
    fgets(pattern,20,stdin);
    l=strlen(pattern);
    i = kmp(target, strlen(target)-1, pattern, strlen(pattern)-1);
    //printf("I is : %d\n",i);
    if (i == -1)
        puts("False");
    else
        puts("True");
    getch();
    return 0;
}

関数 kmp() を呼び出して結果を取得します。kmp() 関数で結果を出力することもできます。kmp() 関数は次のとおりです。

int kmp(char *target, int tsize, char *pattern, int psize)
{
    int i;
    int *pi = compute_prefix_function(pattern, psize);
    int k = -1;
    if (!pi)
        return -1;
    for (i = 0; i < tsize; i++) {

        while (k > -1 && pattern[k+1] != target[i])
            k = pi[k];
        if (target[i] == pattern[k+1])
            k++;
              if (k == psize - 1) {
            free(pi);
            return i-k;
        }
    }
    free(pi);
    return -1;
}

kmpでは、compute_prefix_function(pattern, psize) を呼び出します。以下のとおりです。

int *compute_prefix_function(char *pattern, int psize)
{
    int k = -1;
    int i = 1;
    int *pi = malloc(sizeof(int)*psize);
    if (!pi)
        return NULL;

    pi[0] = k;
    for (i = 1; i < psize; i++) {
        while (k > -1 && pattern[k+1] != pattern[i])
            k = pi[k];
        if (pattern[i] == pattern[k+1])
            k++;
        pi[i] = k;
    }
    return pi;
}

ヘッダー ファイルを呼び出す必要があります。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

私がやりたいことは次のとおりです。

dll/共有ライブラリ形式で実装を作成します。基本的に、dll には、文字列を受け取り、文字列が存在するかどうかを示す bool を返す関数拡張が必要です。

そのために、どの関数を .c ファイルとヘッダー ファイルに入れる必要があり、このために .dll ファイルを作成する方法を教えてください。

Windows 7、VS 2010、および C プログラミングを使用しています。

順を追って説明してください。

4

1 に答える 1

2

DLL については後で詳しく説明しますが、まず、これを行うために必要なソース ファイルのレイアウトを次に示します。

次の 3 つのファイルが必要です。

  • main.c
  • kmph.h
  • kmp.c。

コード構造:

ファイル main.c

#include <stdio.h>
#include "kmp.h"  // this will make the kmp() function known to main()

int main(int argc, const char *argv[])
{
    char target[200];
   ... same code as you aready have

}

ファイル kmp.h

// prototype to make kmp() function known to external programs (via #include)
extern int kmp(char *target, int tsize, char *pattern, int psize);

ファイル kmp.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// declare kmp prototype as DLL-export
_declspec(dllexport) int kmp(char *target, int tsize, char *pattern, int psize);

// prototype for internal helper function
static int *compute_prefix_function(char *pattern, int psize); 


//
// implementation of kmp() function (and helper)
// 

int kmp(char *target, int tsize, char *pattern, int psize)
{
    int i;
    ... same program code as you aready have
}

int *compute_prefix_function(char *pattern, int psize)
{
    int k = -1;
    ... same program code as you aready have
}

.

ここで、最初のステップとして、これら 3 つのファイルを作成し、現在のプロジェクトでコンパイルできます (つまり、現在のプロジェクト ソースをこれら 3 つのファイルに分割し、kmp の __declspec(dllexport) と書かれている行を省略して、次のようにコンパイルします)。すべてが機能するかどうかを確認する前に (非 DLL))。

.

次に、kmp.h と kmp.c の DLL プロジェクトを作成する必要があります (KMP.DLL と KMP.LIB をコンパイルします)。次に、main.c を使用して通常のプログラム (現在のサンプルと同様) を作成し、それを KMP.LIB / KMP.DLL とリンクする必要があります。

ここには VS2005 しかないので、以下は少しあいまいかもしれませんが、DLL プロジェクトを作成する手順は基本的に次のようになります。

  • 新しいプロジェクト: タイプ Win32 / Win32-Project
  • 名前 KMP
  • ウィザードでタイプ DLL を選択し、「空のプロジェクト」をチェックします。
  • kmp.c および kmp.h ファイルを追加します

メイン プロジェクト (main.c プログラムを含むプロジェクト) では、次のことができます。

  • ファイル メニュー > 追加 > 既存のプロジェクト > KMP.vcproj

これにより、DLL が自動的にビルドされ、main.c プログラム プロジェクトとリンクされます。

于 2013-06-11T10:12:30.960 に答える