VCでのdllからのライブラリファイル作成について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
Ciel
記事: 252
登録日時: 8年前

VCでのdllからのライブラリファイル作成について

#1

投稿記事 by Ciel » 8年前

お世話になります。

VC2008を使ってますが、dllからのライブラリファイル作成について、質問があります。
今、euc-jp→SHIFT-JISへの文字コードの変換を行うために、
WINAPIのConvertINetMultiByteToUnicodeっていう関数を使おうとしています。

これのヘッダファイルはmlang.hなんですが、ライブラリファイル(.lib)がありません。

なので↓のリンク先を参考にライブラリファイルを手動で作ったのですが、
リンクエラーがまだ発生してしまいます。
http://ameblo.jp/nana-2007-july/entry-10101317623.html

defファイルの中身は↓です。
これを使って、上記リンクの通りコマンドプロンプトから実行して、
libファイルは作成できたのですが、リンクエラーが出るのです。

コード:

EXPORTS
	ConvertINetReset
	ConvertINetString
	ConvertINetUnicodeToMultiByte
	ConvertINetMultiByteToUnicode
	DllCanUnloadNow
	DllGetClassObject
	GetGlobalFontLinkObject
	IsConvertINetStringAvailable
	LcidToRfc1766A
	LcidToRfc1766W
	Rfc1766ToLcidA
	Rfc1766ToLcidW
エラーメッセージは、
【error LNK2019: 未解決の外部シンボル _ConvertINetMultiByteToUnicode@24】

こんな感じです。
この関数以外は使ってません。

何が原因が分かる方いらっしゃれば、アドバイスいただければと思います。

よろしくお願い致します。
oui C'est la Vie♪

アバター
toyo
記事: 35
登録日時: 8年前
住所: 宮崎県

Re: VCでのdllからのライブラリファイル作成について

#2

投稿記事 by toyo » 8年前

libファイルはプロジェクトの設定や#pragma等でリンクしましたか
DLL呼び出しならLoadLibrary()とGetProcAddress ()を使う方法もあります

それとEUC-JPからSJISへの変換ならUNICODEを使う必要は無いですよ

アバター
Ciel
記事: 252
登録日時: 8年前

Re: VCでのdllからのライブラリファイル作成について

#3

投稿記事 by Ciel » 8年前

toyo さんが書きました:libファイルはプロジェクトの設定や#pragma等でリンクしましたか
DLL呼び出しならLoadLibrary()とGetProcAddress ()を使う方法もあります

それとEUC-JPからSJISへの変換ならUNICODEを使う必要は無いですよ
toyoさん、ありがとうございます
リンクの設定は間違いなくしましたが、ダメでした。

LoadLibraryとかは使ったことないので、また調べてやってみます。

>>それとEUC-JPからSJISへの変換ならUNICODEを使う必要は無いですよ

もしお時間があれば、これについてどういうことか、ちょこっと説明していただけると助かります。

今ちょっと時間ないので返信は大分遅れると思います。
oui C'est la Vie♪

アバター
toyo
記事: 35
登録日時: 8年前
住所: 宮崎県

Re: VCでのdllからのライブラリファイル作成について

#4

投稿記事 by toyo » 8年前

LoadLibraryを使ったサンプルです

コード:

#include <stdio.h>
#include <windows.h>
// ConvertINetMultiByteToUnicode の引数戻り値と同じ関数ポインタを定義
typedef HRESULT (__stdcall *func)(LPDWORD, DWORD, LPCSTR, LPINT, LPWSTR, LPINT);
int main(void)
{
    FILE* fp;
    HRESULT ret;
    DWORD mode = 0;
    int length = 255;
    WCHAR string[256] = {0};
    // DLLを読み込み
    HMODULE hDll = LoadLibrary(TEXT("mlang.dll"));
    // DLL関数のポインタを取得
    func ConvertINetMultiByteToUnicode = (func)GetProcAddress(hDll, "ConvertINetMultiByteToUnicode");
    // 関数実行
    ret = ConvertINetMultiByteToUnicode(&mode, 932, "テスト", NULL, string, &length);
    // テキストに出力
    fp = fopen("test.txt", "w");
    fputc(0xFF, fp); // BOM(Byte Order Mark)
    fputc(0xFE, fp); // Little Endian
    fwrite(string, sizeof(WCHAR), length, fp);
    fclose(fp);
    return 0;
}
EUC-JPもシフトJISもJISコードを変換した物なので計算式で相互変換が可能です
EUC-JPをJISに変換しJISからシフトJISに変換すればUNICODEは関係なく変換できます
http://homepage3.nifty.com/aokura/src/euc2ms.html
に変換コードのサンプルがあります(3バイトEUC-JPの文字には対応してないようです)

閉鎖

“C言語何でも質問掲示板” へ戻る